Submission #1159637

#TimeUsernameProblemLanguageResultExecution timeMemory
1159637bbldrizzyRobot (JOI21_ho_t4)C++20
0 / 100
420 ms70652 KiB
#include <bits/stdc++.h> #define f first #define s second using namespace std; using ll = long long; using P = pair<ll, ll>; vector<map<ll, ll>> adj; vector<ll> dp1; vector<map<ll, ll>> dp2; int main() { ll n,m; cin >> n >> m; adj.resize(n+1); vector<vector<pair<int, P>>> ajd(n+1); dp1.resize(n+1, 1e9); dp2.resize(n+1); for (int i = 0; i < m; i++) { ll a, b, c, p; cin >> a >> b >> c >> p; adj[a][c] += p; adj[b][c] += p; ajd[a].push_back({b, {c, p}}); // leading node, color, cost: <node, <color, cost>> ajd[b].push_back({a, {c, p}}); } vector<vector<pair<int, P>>> AJD = ajd; /* for (int i = 1; i <= n; i++) { for (auto u1: ajd[i]) { cout << "u: " << u1.f << ", " << u1.s.f << ", " << u1.s.s << "\n"; } cout << "\n"; } cout << "\n"; cout << "\n"; cout << "\n"; cout << "\n"; */ for (int i = 1; i <= n; i++) { for (auto &u: ajd[i]) { //if (u.s.s != adj[i][u.s.f]) u.s.s = min(adj[i][u.s.f]-u.s.s, u.s.s); u.s.s = min(adj[i][u.s.f]-u.s.s, u.s.s); } } /* for (int i = 1; i <= n; i++) { for (auto u1: ajd[i]) { cout << "u: " << u1.f << ", " << u1.s.f << ", " << u1.s.s << "\n"; } cout << "\n"; } */ priority_queue<P, vector<P>, greater<P>> pq; ll start = 1; dp1[start] = 0; pq.push({0, start}); while (!pq.empty()) { P u = pq.top(); pq.pop(); if (u.f != dp1[u.s]) continue; //cout << "u(val, node): " << u.f << ", " << u.s << "\n"; ll counter = 0; for (pair<int, P> u1: ajd[u.s]) { //cout << "u1(nxtnode, color, cost): " << u1.f << ", " << u1.s.f << ", " << u1.s.s << '\n'; if (dp2[u1.f].count(u1.s.f) > 0) { //cout << "dp2 of u1.f, u1.s.f MAY BECOME dp1 of u.s: " << u1.f << ", " << u1.s.f << " ::: " << u.s << "\n"; //cout << "dp2[u1.f][u1.s.f], dp1[u.s]: " << dp2[u1.f][u1.s.f] << ", " << dp1[u.s] << '\n'; dp2[u1.f][u1.s.f] = min(dp2[u1.f][u1.s.f], dp1[u.s]); } else { //cout << "dp2 of u1.f, u1.s.f becomes dp1 of u.s: " << u1.f << ", " << u1.s.f << " ::: " << u.s << "\n"; //cout << "dp1[u.s]: " << dp1[u.s] << '\n'; dp2[u1.f][u1.s.f] = dp1[u.s]; } if (u1.s.s != AJD[u.s][counter].s.s) { ll v1 = dp1[u.s]+u1.s.s; bool truzz = dp2[u.s].count(u1.s.f)>0; if (truzz) { ll v2 = dp2[u.s][u1.s.f]+u1.s.s; if (v1 < dp1[u1.f] || v2 < dp1[u1.f]) { //cout << "u, dp1[u.s], u1.s.s: " << u.s << ", " << dp1[u.s] << "\n"; //cout << "yo wtf here are u1.f, v1, v2: " << u1.f << ", " << v1 << ", " << v2 << "\n"; pq.push({dp1[u1.f]=min(v1, v2), u1.f}); } } else { if (v1 < dp1[u1.f]) { pq.push({dp1[u1.f]=v1, u1.f}); } } } else { if (dp1[u.s] + u1.s.s < dp1[u1.f]) { //cout << "YO, u1.f, u.s, dp1[u.s], u1.s.s: " << u1.f << ", " << u.s << ", " << dp1[u.s] << ", " << u1.s.s << '\n'; dp1[u1.f] = dp1[u.s]+u1.s.s; pq.push({dp1[u1.f], u1.f}); } } counter++; } } if (dp1[n] != 1e9) { cout << dp1[n]; } else { cout << -1; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...