Submission #45521

#TimeUsernameProblemLanguageResultExecution timeMemory
45521realityCommuter Pass (JOI18_commuter_pass)C++17
0 / 100
2084 ms262144 KiB
#include "bits/stdc++.h" using namespace std; #define fi first #define se second #define ll long long #define dbg(v) cerr<<#v<<" = "<<v<<'\n' #define vi vector<int> #define vl vector <ll> #define pii pair<int,int> #define mp make_pair #define db long double #define pb push_back #define all(s) s.begin(),s.end() template < class T > T smin(T &a,T b) {if (a > b) a = b;return a;} template < class T > T smax(T &a,T b) {if (a < b) a = b;return a;} const int N = (int)(1e6) + 5; vector < pii > g[N]; ll D1[N]; ll D2[N]; ll D3[N]; ll D4[N]; int S,T,U,V; vi g1[N]; vi g2[N]; ll D[N]; int main(void) { int n,m; cin>>n>>m; cin>>S>>T; cin>>U>>V; while (m --) { int a,b,c; cin>>a>>b>>c; g[a].pb(mp(b,c)); g[b].pb(mp(a,c)); } priority_queue < pii , vector < pii > , greater < pii > > Q; for (int i = 1;i <= n;++i) D1[i] = D2[i] = D3[i] = D4[i] = 1e18; D1[S] = 0; Q.push(mp(0,S)); while (!Q.empty()) { ll cost = Q.top().fi; int node = Q.top().se; Q.pop(); if (D1[node] != cost) continue; for (auto it : g[node]) if (D1[it.fi] > D1[node] + it.se) D1[it.fi] = D1[node] + it.se,Q.push(mp(D1[it.fi],it.fi)); } D2[T] = 0; Q.push(mp(0,T)); while (!Q.empty()) { ll cost = Q.top().fi; int node = Q.top().se; Q.pop(); if (D2[node] != cost) continue; for (auto it : g[node]) if (D2[it.fi] > D2[node] + it.se) D2[it.fi] = D2[node] + it.se,Q.push(mp(D2[it.fi],it.fi)); } D3[U] = 0; Q.push(mp(0,U)); while (!Q.empty()) { ll cost = Q.top().fi; int node = Q.top().se; Q.pop(); if (D3[node] != cost) continue; for (auto it : g[node]) if (D3[it.fi] > D3[node] + it.se) D3[it.fi] = D3[node] + it.se,Q.push(mp(D3[it.fi],it.fi)); } D4[V] = 0; Q.push(mp(0,V)); while (!Q.empty()) { ll cost = Q.top().fi; int node = Q.top().se; Q.pop(); if (D4[node] != cost) continue; for (auto it : g[node]) if (D4[it.fi] > D4[node] + it.se) D4[it.fi] = D4[node] + it.se,Q.push(mp(D4[it.fi],it.fi)); } for (int i = 1;i <= n;++i) { for (auto it : g[i]) { if (D1[i] + it.se + D2[it.fi] == D1[T]) g1[i].pb(it.fi); if (D2[i] + it.se + D1[it.fi] == D1[T]) g2[i].pb(it.fi); } } queue < int > q; q.push(S); vi order; while (!q.empty()) { int node = q.front(); order.pb(node); q.pop(); for (auto it : g[node]) if (D1[node] + it.se + D2[it.fi] == D1[T]) q.push(it.fi); } ll ans = 1e18; for (int i = 1;i <= n;++i) D[i] = D3[i]; for (auto u : order) for (auto v : g2[u]) smin(D[u],D[v]); for (int i = 1;i <= n;++i) smin(ans,D[i] + D4[i]); for (int i = 1;i <= n;++i) D[i] = D3[i]; reverse(all(order)); for (auto u : order) for (auto v : g1[u]) smin(D[u],D[v]); for (int i = 1;i <= n;++i) smin(ans,D[i] + D4[i]); reverse(all(order)); for (int i = 1;i <= n;++i) D[i] = D4[i]; for (auto u : order) for (auto v : g2[u]) smin(D[u],D[v]); for (int i = 1;i <= n;++i) smin(ans,D[i] + D3[i]); for (int i = 1;i <= n;++i) D[i] = D4[i]; reverse(all(order)); for (auto u : order) for (auto v : g1[u]) smin(D[u],D[v]); for (int i = 1;i <= n;++i) smin(ans,D[i] + D3[i]); cout << ans << '\n'; return 0; }

Compilation message (stderr)

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:90:7: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
       if (D1[i] + it.se + D2[it.fi] == D1[T])
       ^~
commuter_pass.cpp:92:4: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
    if (D2[i] + it.se + D1[it.fi] == D1[T])
    ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...