제출 #526656

#제출 시각아이디문제언어결과실행 시간메모리
526656LoboRobot (JOI21_ho_t4)C++17
100 / 100
1040 ms120112 KiB
#include<bits/stdc++.h> using namespace std; vector<pair<long long,pair<long long,long long>>> g[220000]; map<long long,vector<pair<long long,long long>>> gc[220000]; map<long long,long long> d[220000], sm[220000]; int32_t main() { long long n, m; cin >> n >> m; for(long long i = 1; i <= m; i++) { long long u, v, c, w; cin >> u >> v >> c >> w; g[u].push_back(make_pair(v,make_pair(c,w))); g[v].push_back(make_pair(u,make_pair(c,w))); } for(long long i = 1; i <= n; i++) { d[i][0] = 1000000000000000010; for(auto V : g[i]) { d[i][V.second.first] = 1000000000000000010; gc[i][V.second.first].push_back(make_pair(V.first,V.second.second)); sm[i][V.second.first]+= V.second.second; } } priority_queue<pair<long long,pair<long long,long long>>> pq; pq.push(make_pair(0,make_pair(1,0))); d[1][0] = 0; while(pq.size()) { long long u = pq.top().second.first; long long dist = -pq.top().first; long long cl = pq.top().second.second; pq.pop(); if(dist != d[u][cl]) continue; if(cl == 0) { for(auto V : g[u]) { long long v = V.first; long long c = V.second.first; long long w = V.second.second; if(d[v][c] > d[u][0]) { d[v][c] = d[u][0]; pq.push(make_pair(-d[v][c],make_pair(v,c))); } if(d[v][0] > d[u][0] + min(sm[u][c]-w,w)) { d[v][0] = d[u][0] + min(sm[u][c]-w,w); pq.push(make_pair(-d[v][0],make_pair(v,0))); } } } else { for(auto V : gc[u][cl]) { long long v = V.first; long long w = V.second; long long c = cl; if(d[v][0] > d[u][c] + sm[u][c] - w) { d[v][0] = d[u][c] + sm[u][c] - w; pq.push(make_pair(-d[v][0],make_pair(v,0))); } } } } if(d[n][0] == 1000000000000000010) cout << -1 << endl; else cout << d[n][0] << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...