Submission #492651

#TimeUsernameProblemLanguageResultExecution timeMemory
492651leu_nautCommuter Pass (JOI18_commuter_pass)C++11
100 / 100
601 ms35432 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define FOR(i,a,b) for (int i = a; i <= b; ++i) #define FORd(i,a,b) for (int i = a; i >= b; --i) #define pii pair <ll,ll> #define FastIO ios_base::sync_with_stdio(0); cin.tie(0); #define tri pair <ll,pii> #define f first #define s second const int N = 2e5; const int MOD = 1e9 + 7; const ll oo = 1e18; vector <pii> g[N + 5]; ll Du[N + 5], Dv[N + 5], ans = LLONG_MAX, D[N + 5], vs[N + 5], dp[2][N + 5],n; void dijsktra_u(int x) { memset(vs,0,sizeof(vs)); for (int i = 1; i <= n; ++i) Du[i] = oo; Du[x] = 0; priority_queue <pii> q; q.push(pii(0,x)); while (!q.empty()) { ll u,w; tie(w,u) = q.top(); q.pop(); if (!vs[u]) { vs[u] = 1; Du[u] = -w; for (auto i : g[u]) q.push(pii(w - i.s,i.f)); } } } void dijsktra_v(int x) { memset(vs,0,sizeof(vs)); for (int i = 1; i <= n; ++i) Dv[i] = oo; Dv[x] = 0; priority_queue <pii> q; q.push(pii(0,x)); while (!q.empty()) { ll u,w; tie(w,u) = q.top(); q.pop(); if (!vs[u]) { vs[u] = 1; Dv[u] = -w; for (auto i : g[u]) q.push(pii(w - i.s, i.f)); } } } void dijsktra(int x, int y) { memset(vs,0,sizeof(vs)); FOR(i,0,n) dp[0][i] = oo, dp[1][i] = oo, D[i] = oo; D[x] = 0; priority_queue <tri> q; q.push(tri(0,pii(x,0))); while (!q.empty()) { ll w,u,par; pii z; tie(w,z) = q.top(); q.pop(); tie(u,par) = z; if (!vs[u]) { vs[u] = 1; D[u] = -w; dp[0][u] = min(Du[u], dp[0][par]); dp[1][u] = min(Dv[u], dp[1][par]); for (auto i : g[u]) q.push(tri(w - i.s, pii(i.f,u))); } else if (D[u] == -w) { ll tmp1 = min(Du[u], dp[0][par]), tmp2 = min(Dv[u], dp[1][par]); if (tmp1 + tmp2 <= dp[0][u] + dp[1][u]) { dp[0][u] = min(dp[0][par],tmp1); dp[1][u] = min(dp[1][par],tmp2); } } } ans = min(ans, dp[0][y] + dp[1][y]); } int main() { FastIO ll m,s,t,u,v; cin >> n >> m >> s >> t >> u >> v; FOR(i,1,m) { int u,v,w; cin >> u >> v >> w; g[u].push_back(pii(v,w)); g[v].push_back(pii(u,w)); } dijsktra_u(u); dijsktra_v(v); ans = min(ans, Du[v]); dijsktra(s,t); //cout << dp[0][5] << ' ' << dp[1][5] << '\n'; dijsktra(t,s); cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...