Submission #1129943

#TimeUsernameProblemLanguageResultExecution timeMemory
1129943NoMercyRobot (JOI21_ho_t4)C++20
100 / 100
887 ms82628 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll inf = 1e16 + 66; int32_t main () { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int N, M; cin >> N >> M; map<ll, vector<array<ll, 3>>> g[N]; map<ll, ll> sum[N]; for (int i = 0;i < M;i ++) { ll u, v, c, p; cin >> u >> v >> c >> p; -- u; -- v; g[u][c].push_back({v, c, p}); g[v][c].push_back({u, c, p}); sum[u][c] += p; sum[v][c] += p; } map<ll, ll> dp[N]; vector<ll> dist(N, inf); dist[0] = 0; priority_queue<array<ll, 3>> pq; pq.push({0, 0, 0}); while (pq.size() > 0) { auto [val, u, c] = pq.top(); pq.pop(); ll tmp; if (c == 0) { if (dist[u] != -val) continue; for (auto [fi, se] : g[u]) { for (auto [v, _c, p] : se) { tmp = sum[u][_c] - p - val; if (tmp < dist[v]) { dist[v] = tmp; pq.push({-dist[v], v, 0}); } tmp = p - val; if (tmp < dist[v]) { dist[v] = tmp; pq.push({-dist[v], v, 0}); } tmp = -val; if (dp[v].count(_c) == 0 || tmp < dp[v][_c]) { dp[v][_c] = tmp; pq.push({-dp[v][_c], v, _c}); } } } } else { if (dp[u][c] != -val) continue; for (auto [v, _c, p] : g[u][c]) { tmp = sum[u][c] - p; if (tmp - val < dist[v]) { dist[v] = tmp - val; pq.push({-dist[v], v, 0}); } } } } cout << (dist[N - 1] < inf ? dist[N - 1] : -1) << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...