제출 #1013981

#제출 시각아이디문제언어결과실행 시간메모리
1013981OtalpCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
781 ms61780 KiB
#include<bits/stdc++.h> using namespace std; #define pii pair<int, int> #define ff first #define ss second #define ll long long #define pll pair<ll, ll> #define pb push_back #define int ll #define mp make_pair vector<pii> q[200100], dq[200100]; int us[200100], dp[200100], bd[200100], pos[200100], ddp[200100][4], dus[200100][4]; pii d1, d2; int dfs(int v){ if(v == d1.ss){ bd[v] = 1; } pos[v] = 1; for(pii h: q[v]){ int to = h.ff; int x = h.ss; if(dp[to] != dp[v] + x) continue; if(!pos[to] and dp[to] == dp[v] + x) dfs(to); bd[v] |= bd[to]; } return bd[v]; } void solve(){ int n, m; cin>>n>>m; cin>>d1.ff>>d1.ss; cin>>d2.ff>>d2.ss; for(int i=1; i<=m; i++){ int l, r, x; cin>>l>>r>>x; q[l].pb({r, x}); q[r].pb({l, x}); } set<pii> d; d.insert({0, d1.ff}); while(d.size()){ auto it = *d.begin(); int v = it.ss; if(us[v]){ d.erase(d.find(it)); continue; } us[v] = 1; dp[v] = it.ff; for(pii h: q[v]){ int to = h.ff; int x = h.ss; if(us[to]) continue; d.insert({dp[v] + x, to}); } } dfs(d1.ff); set<pair<pii, int>> dd; for(int i=1; i<=n; i++) us[i] = 0; dd.insert(mp(mp(0, 0), d2.ff)); while(dd.size()){ auto it = *dd.begin(); int v = it.ss; int f = it.ff.ss; if(dus[v][f]){ dd.erase(dd.find(it)); continue; } //cout<<it.ff.ff<<' '<<it.ff.ss<<' '<<it.ss<<'\n'; dus[v][f] = 1; ddp[v][f] = it.ff.ff; if(f == 0){ for(pii h: q[v]){ int to = h.ff; int x = h.ss; if(dus[to][1]) continue; if(bd[v] and bd[to] and dp[to] == dp[v] + x) dd.insert(mp(mp(ddp[v][f], 1), to)); } for(pii h: q[v]){ int to = h.ff; int x = h.ss; if(dus[to][2]) continue; if(bd[v] and bd[to] and dp[v] == dp[to] + x) dd.insert(mp(mp(ddp[v][f], 2), to)); } for(pii h: q[v]){ int to = h.ff; int x = h.ss; if(dus[to][0]) continue; dd.insert(mp(mp(ddp[v][f] + x, 0), to)); } } if(f == 1){ for(pii h: q[v]){ int to = h.ff; int x = h.ss; if(dus[to][1]) continue; if(bd[v] and bd[to] and dp[to] == dp[v] + x) dd.insert(mp(mp(ddp[v][f], 1), to)); } for(pii h: q[v]){ int to = h.ff; int x = h.ss; if(dus[to][3]) continue; dd.insert(mp(mp(ddp[v][f] + x, 3), to)); } } if(f == 2){ for(pii h: q[v]){ int to = h.ff; int x = h.ss; if(dus[to][2]) continue; if(bd[v] and bd[to] and dp[v] == dp[to] + x) dd.insert(mp(mp(ddp[v][f], 2), to)); } for(pii h: q[v]){ int to = h.ff; int x = h.ss; if(dus[to][3]) continue; dd.insert(mp(mp(ddp[v][f] + x, 3), to)); } } if(f == 3){ for(pii h: q[v]){ int to = h.ff; int x = h.ss; if(dus[to][3]) continue; dd.insert(mp(mp(ddp[v][f] + x, 3), to)); } } } int ans = 1e18; for(int i=0; i<4; i++){ if(!dus[d2.ss][i]) continue; ans = min(ans, ddp[d2.ss][i]); } cout<<ans<<'\n'; } signed main(){ solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...