제출 #870154

#제출 시각아이디문제언어결과실행 시간메모리
870154PanndaRobot (JOI21_ho_t4)C++17
34 / 100
3055 ms34384 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const long long INF = (int)4e18; signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); // freopen("inp.inp", "r", stdin); // freopen("out.out", "w", stdout); int n, m; cin >> n >> m; vector<vector<array<int, 3>>> adj(n); for (int i = 0; i < m; i++) { int u, v, color, cost; cin >> u >> v >> color >> cost; u--; v--; adj[u].push_back({ v, color, cost }); adj[v].push_back({ u, color, cost }); } map<array<int, 2>, long long> dist; // (u, par) -> distance priority_queue<array<long long, 3>, vector<array<long long, 3>>, greater<>> pq; dist[{0, -1}] = 0; pq.push({0, 0, -1}); while (!pq.empty()) { auto [d, u, p] = pq.top(); pq.pop(); if (dist.count({u, p}) && dist[{u, p}] != d) continue; map<int, long long> mp; // color to sum of cost for (auto [v, color, cost] : adj[u]) { if (v == p) continue; mp[color] += cost; } for (auto [v, color, cost] : adj[u]) { if (v == p) continue; if (!dist.count({v, u}) || dist[{v, u}] > d + cost) { dist[{v, u}] = d + cost; pq.push({ d + cost, v, u }); } if (!dist.count({v, -1}) || dist[{v, -1}] > d + mp[color] - cost) { dist[{v, -1}] = d + mp[color] - cost; pq.push({ d + mp[color] - cost, v, -1 }); } } } long long ans = INF; for (auto [arr, d] : dist) { auto [u, p] = arr; if (u == n - 1) { ans = min(ans, d); } } if (ans == INF) ans = -1; cout << ans << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...