제출 #654504

#제출 시각아이디문제언어결과실행 시간메모리
654504hailCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
378 ms25196 KiB
#include <bits/stdc++.h> using namespace std; #define vi vector<int> #define vll vector<long long> #define pb push_back using ll= long long; #define fast_io ios::sync_with_stdio(0); cin.tie(0) #define inpint(x) int x; cin>>x #define inpll(x) long long x; cin>>x #define fl(i, n) for(int i=0; i<n; i++) #define flo(i, n) for(int i=1; i<=n; i++) #define int long long #define pi pair<int, int> #define mp make_pair #define ld long double const int MOD = 7 + (int)1e9; const int INF = (int)1e18; // void solve() { int n, m; cin>>n>>m; int s, t; cin>>s>>t; int u, v; cin>>u>>v; vector<vector<pi>> adjlist(n+1, vector<pi>(0)); for(int i=1; i<=m; i++) { int a, b, c; cin>>a>>b>>c; adjlist[a].pb({b, c}); adjlist[b].pb({a, c}); } vector<int> vc(n+1, INF); vector<int> uc(n+1, INF); priority_queue<pi, vector<pi>, greater<pi>> pq; uc[u] = 0; vc[v] = 0; pq.push({0, u}); while(not pq.empty()) { int i = pq.top().second; int c = pq.top().first; pq.pop(); if(uc[i]<c) continue; for(auto j: adjlist[i]) { if(uc[j.first]<=c+j.second) continue; uc[j.first] = c+j.second; pq.push({uc[j.first], j.first}); } } pq.push({0, v}); while(not pq.empty()) { int i = pq.top().second; int c = pq.top().first; pq.pop(); if(vc[i]<c) continue; for(auto j: adjlist[i]) { if(vc[j.first]<=c+j.second) continue; vc[j.first] = c+j.second; pq.push({vc[j.first], j.first}); } } int ans = uc[v]; vector<int> minsu(n+1, INF); vector<int> mintu(n+1, INF); vector<int> minsv(n+1, INF); vector<int> mintv(n+1, INF); vector<int> sc(n+1, INF); vector<int> tc(n+1, INF); sc[s] = 0; tc[t] = 0; minsu[s] = uc[s]; minsv[s] = vc[s]; mintu[t] = uc[t]; mintv[t] = vc[t]; pq.push({0, s}); while(not pq.empty()) { int i = pq.top().second; int c = pq.top().first; pq.pop(); if(c>sc[i]) continue; for(auto j: adjlist[i]) { int cd = c + j.second; if(cd==sc[j.first]) { minsu[j.first] = min(minsu[i], minsu[j.first]); minsv[j.first] = min(minsv[i], minsv[j.first]); continue; } if(cd>sc[j.first]) continue; minsu[j.first] = min(minsu[i], uc[j.first]); minsv[j.first] = min(minsv[i], vc[j.first]); sc[j.first] = cd; pq.push({sc[j.first], j.first}); } } int st = sc[t]; pq.push({0, t}); vector<bool> visited(n+1, false); while(not pq.empty()) { int i = pq.top().second; int c = pq.top().first; visited[i] = true; pq.pop(); if(c>tc[i]) continue; for(auto j: adjlist[i]) { int cd = c + j.second; if(visited[j.first]) { int x = sc[i] + tc[j.first] + j.second; int y = sc[j.first] + tc[i] + j.second; if(x==st || y==st) { if(sc[i]<sc[j.first]) { x = minsu[i] + mintv[j.first]; y = minsv[i] + mintu[j.first]; ans = min({ans, x, y}); continue; } else { x = mintu[i] + minsv[j.first]; y = mintv[i] + minsu[j.first]; ans = min({ans, x, y}); continue; } } } if(cd==tc[j.first]) { mintu[j.first] = min(mintu[i], mintu[j.first]); mintv[j.first] = min(mintv[i], mintv[j.first]); continue; } if(cd>tc[j.first]) continue; mintu[j.first] = min(mintu[i], uc[j.first]); mintv[j.first] = min(mintv[i], vc[j.first]); tc[j.first] = cd; pq.push({tc[j.first], j.first}); } } cout<<ans; } signed main() { fast_io; int t=1; //cin>>t; while(t--) { solve(); } cout<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...