Submission #1003800

#TimeUsernameProblemLanguageResultExecution timeMemory
1003800overwatch9Robot (JOI21_ho_t4)C++17
0 / 100
3059 ms24764 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int maxn = 1e5 + 1; vector <array <int, 3>> adj[maxn]; bool processed[maxn][2]; ll dis[maxn][2]; int main() { int n, m; cin >> n >> m; for (int i = 0; i < m; i++) { int a, b, c, p; cin >> a >> b >> c >> p; adj[a].push_back({b, c, p}); adj[b].push_back({a, c, p}); } for (int i = 2; i <= n; i++) dis[i][0] = dis[i][1] = 1e18; priority_queue <array <ll, 4>> pq; pq.push({0, 0, 1, 0}); ll ans = 1e18; while (!pq.empty()) { int s = pq.top()[2]; int col = pq.top()[1]; int p = pq.top()[3]; bool changed = (col < 0); pq.pop(); if (s == n) ans = min(ans, dis[s][changed]); if (processed[s][changed]) continue; processed[s][changed] = true; vector <int> cnt(m+1); vector <ll> sum(m+1); for (auto i : adj[s]) { if (i[0] != p || (i[0] == p && !changed)) { cnt[i[1]]++; sum[i[1]] += i[2]; } } // if (changed) // cnt[-col]--; for (auto i : adj[s]) { int nxt = i[0], col2 = i[1]; if (nxt == p) continue; ll cost = min((ll)i[2], sum[i[1]] - i[2]); // if () if (cnt[col2] == 1) { if (dis[nxt][false] > dis[s][changed]) { dis[nxt][false] = dis[s][changed]; pq.push({-dis[nxt][false], col2, nxt, s}); } } bool x = true; if (cost == sum[i[1]] - i[2] && i[2] != sum[i[1]] - i[2]) x = false; if (dis[nxt][x] > dis[s][changed] + cost) { dis[nxt][x] = dis[s][changed] + cost; if (x) col2 = -col2; pq.push({-dis[nxt][x], col2, nxt, s}); } } } if (ans == 1e18) ans = -1; cout << ans << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...