제출 #160121

#제출 시각아이디문제언어결과실행 시간메모리
160121combi1k1Commuter Pass (JOI18_commuter_pass)C++14
100 / 100
513 ms28584 KiB
#include<bits/stdc++.h> using namespace std; #define X first #define Y second #define ll long long #define FOR(i,a,b) for(int i = a ; i < b ; ++i) const int N = 1e5 + 1; const ll inf = 1e15; typedef pair<ll,ll> ii; vector<ii> g[N]; ll fS[N], fT[N]; ll fU[N], fV[N]; int deg[N]; void dijkstra(int S,ll *d) { FOR(i,1,N) d[i] = inf; priority_queue<ii,vector<ii>,greater<ii> > pq; d[S] = 0; pq.push(ii(0,S)); while (pq.size()) { int u = pq.top().Y; ll du = pq.top().X; pq.pop(); if (du != d[u]) continue; for(ii e : g[u]) { int v = e.X; int C = e.Y; if (d[v] > du + C) { d[v] = du + C; pq.push({d[v],v}); } } } } ll dp1[N]; ll dp2[N]; ll ans = inf; vector<int> fr[N]; vector<int> to[N]; void dfs(int u) { dp1[u] = fU[u]; dp2[u] = fV[u]; for(int v : to[u]) dp1[u] = min(dp1[u],dp1[v]); for(int v : to[u]) dp2[u] = min(dp2[u],dp2[v]); for(int v : fr[u]) { deg[v]--; if (deg[v] == 0) dfs(v); } ans = min(ans,dp1[u] + fV[u]); ans = min(ans,dp2[u] + fU[u]); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m; cin >> n >> m; int S, T; cin >> S >> T; int U, V; cin >> U >> V; FOR(i,0,m) { int x; cin >> x; int y; cin >> y; int c; cin >> c; g[x].push_back(ii(y,c)); g[y].push_back(ii(x,c)); } dijkstra(S,fS); dijkstra(T,fT); dijkstra(U,fU); dijkstra(V,fV); FOR(i,1,n + 1) for(ii e : g[i]) { int v = e.X; int C = e.Y; if (fS[i] + fT[v] + C == fS[T]) fr[i].push_back(v), to[v].push_back(i), deg[v]++; } dfs(S); cout << min(ans,fU[V]) << endl; } /* 8 8 5 7 6 8 1 2 2 2 3 3 3 4 4 1 4 1 1 5 5 2 6 6 3 7 7 4 8 8 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...