Submission #1176572

#TimeUsernameProblemLanguageResultExecution timeMemory
1176572Hamed_GhaffariCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
231 ms21908 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; using pll = pair<ll, ll>; const int MXN = 1e5+5; const ll inf = 1e18; int n, m, S, T, U, V; vector<pii> g[MXN]; ll dis[6][MXN]; inline void dijkstra(int v, int id) { fill(dis[id]+1, dis[id]+n+1, inf); dis[id][v] = 0; priority_queue<pll> pq; pq.push({0, v}); while(!pq.empty()) { ll d = -pq.top().first; int v = pq.top().second; pq.pop(); if(d!=dis[id][v]) continue; for(auto [u, w] : g[v]) if(dis[id][u]>d+w) pq.push({-(dis[id][u]=d+w), u}); } } int32_t main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); cin >> n >> m >> S >> T >> U >> V; for(int i=0,u,v,w; i<m; i++) { cin >> u >> v >> w; g[u].push_back({v, w}); g[v].push_back({u, w}); } dijkstra(S, 0); dijkstra(T, 1); fill(dis[2]+1, dis[2]+n+1, inf); fill(dis[3]+1, dis[3]+n+1, inf); fill(dis[4]+1, dis[4]+n+1, inf); fill(dis[5]+1, dis[5]+n+1, inf); priority_queue<pair<ll, pii>> pq; dis[2][U] = 0; pq.push({0, {2, U}}); if(dis[0][U]+dis[1][U]==dis[0][T]) dis[3][U] = 0, pq.push({0, {3, U}}); dis[4][U] = 0, pq.push({0, {4, U}}); dis[5][U] = 0, pq.push({0, {5, U}}); while(!pq.empty()) { ll d = -pq.top().first; int type = pq.top().second.first; int v = pq.top().second.second; pq.pop(); if(d != dis[type][v]) continue; if(type==2) { for(auto [u, w] : g[v]) { if(dis[2][u]>d+w) pq.push({-(dis[2][u]=d+w), {2, u}}); if(dis[0][u]+dis[1][u]==dis[0][T]) { if(dis[3][u]>d+w) pq.push({-(dis[3][u]=d+w), {3, u}}); if(dis[4][u]>d+w) pq.push({-(dis[4][u]=d+w), {4, u}}); } } } else if(type==3) { for(auto [u, w] : g[v]) { if(dis[0][v]+w+dis[1][u]==dis[0][T] && dis[3][u]>d) pq.push({-(dis[3][u]=d), {3, u}}); if(dis[5][u]>d+w) pq.push({-(dis[5][u]=d+w), {5, u}}); } } else if(type==4) { for(auto [u, w] : g[v]) { if(dis[1][v]+w+dis[0][u]==dis[0][T] && dis[4][u]>d) pq.push({-(dis[4][u]=d), {4, u}}); if(dis[5][u]>d+w) pq.push({-(dis[5][u]=d+w), {5, u}}); } } else if(type==5) { for(auto [u, w] : g[v]) if(dis[5][u]>d+w) pq.push({-(dis[5][u]=d+w), {5, u}}); } } cout << min({dis[3][V], dis[4][V], dis[5][V]}) << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...