Submission #1219540

#TimeUsernameProblemLanguageResultExecution timeMemory
1219540trimkusRobot (JOI21_ho_t4)C++20
100 / 100
671 ms91020 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int MAXN = 2e5; ll dp[MAXN + 1]; map<int, ll> ps[MAXN + 1], dp2[MAXN + 1]; map<int, vector<array<int, 3>>> adj[MAXN + 1]; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; for (int i = 0; i < m; ++i) { int a, b, c, w; cin >> a >> b >> c >> w; adj[a][c].push_back({b, c, w}); adj[b][c].push_back({a, c, w}); ps[a][c] += w; ps[b][c] += w; } for (int i = 1; i <= n; ++i) { dp[i] = (ll)1e18; } priority_queue<array<ll, 3>> pq; pq.push({0, 1, 0}); dp[1] = 0; while (pq.size()) { ll cost = -pq.top()[0]; int v = pq.top()[1]; int col = pq.top()[2]; pq.pop(); //~ cerr << v << " " << col << " = " << cost << "\n"; if (col) { if (dp2[v][col] != cost) continue; for (auto& [u, c, w] : adj[v][col]) { ll cost1 = ps[v][c] - w + cost; if (cost1 < dp[u]) { dp[u] = cost1; pq.push({-dp[u], u, 0}); } } } else { if (dp[v] != cost) continue; for (auto& E : adj[v]) { for (auto& [u, c, w] : E.second) { ll cost1 = ps[v][c] - w + cost; if (cost1 < dp[u]) { dp[u] = cost1; pq.push({-dp[u], u, 0}); } ll cost2 = w + cost; if (cost2 < dp[u]) { dp[u] = cost2; pq.push({-dp[u], u, 0}); } ll cost3 = cost; if (!dp2[u].count(c) || cost3 < dp2[u][c]) { dp2[u][c] = cost3; pq.push({-dp2[u][c], u, c}); } } } } } cout << (dp[n] == (ll)1e18 ? -1 : dp[n]) << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...