제출 #927699

#제출 시각아이디문제언어결과실행 시간메모리
927699LonlyRRobot (JOI21_ho_t4)C++17
100 / 100
890 ms117492 KiB
#include<bits/stdc++.h> #define int long long #define ii pair<int,int> #define ff first #define ss second using namespace std; const int maxn = 2e5 + 5; int n, m; int dp[maxn]; vector<array<int, 3>> adj[maxn]; map<int,int> col[maxn]; map<int,int> dpc[maxn]; map<int,vector<ii>> adjc[maxn]; signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); // freopen("test.inp", "r", stdin); // freopen("test.out", "w", stdout); cin >> n >> m; for (int i = 1, u, v, w, t; i <= m; i++) { cin >> u >> v >> w >> t; adj[u].push_back({v, w, t}); adj[v].push_back({u, w, t}); adjc[u][w].emplace_back(v, t); adjc[v][w].emplace_back(u, t); col[u][w] += t; col[v][w] += t; } #define iii tuple<int,int,int> priority_queue<iii, vector<iii>, greater<iii>> pq; memset(dp, 0x3f, sizeof dp); int oo = dp[0]; dp[1] = 0; pq.emplace(0, 1, 0); while (pq.size()) { int u, v, w; tie(v, u, w) = pq.top(); pq.pop(); if (w == 0) { if (v != dp[u]) continue; for (auto p : adj[u]) { int color = p[1], cost = p[2], nxt = p[0]; int val = v + cost, f = 0; if (dp[nxt] > val) dp[nxt] = val, f = 1; if (!dpc[nxt].count(color) || dpc[nxt][color] > val - cost) dpc[nxt][color] = val - cost, pq.emplace(val - cost, nxt, color); val = v + col[u][color] - cost; if (dp[nxt] > val) dp[nxt] = val, f = 1; if (f) pq.emplace(dp[nxt], nxt, 0); } } else { if (v != dpc[u][w]) continue; for (auto p : adjc[u][w]) { int nxt = p.ff, cost = p.ss, color = w; int val = v + col[u][color] - cost; if (dp[nxt] > val) dp[nxt] = val, pq.emplace(dp[nxt], nxt, 0); } } } cout << (dp[n] == oo ? -1 : dp[n]); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...