제출 #1147612

#제출 시각아이디문제언어결과실행 시간메모리
1147612AlgorithmWarriorCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
242 ms30124 KiB
#include <bits/stdc++.h> using namespace std; int const MAX=2e5+5; long long const INF=1e18; int n,m; int nod1,nod2; int nod3,nod4; struct edge{ int u,v,w; }edge[MAX]; struct edg{ int nod,w; }; vector<edg>G[MAX]; long long answer; void read(){ cin>>n>>m; cin>>nod1>>nod2; cin>>nod3>>nod4; int i; for(i=1;i<=m;++i){ cin>>edge[i].u>>edge[i].v>>edge[i].w; auto [u,v,w]=edge[i]; G[u].push_back({v,w}); G[v].push_back({u,w}); } } struct sh_path{ int nod; long long dist; }; class cmp{ public: bool operator()(sh_path a,sh_path b){ return a.dist>b.dist; } }; void dijkstra(int nod,long long path[]){ int i; for(i=1;i<=n;++i) path[i]=INF; priority_queue<sh_path,vector<sh_path>,cmp>pq; pq.push({nod,0}); path[nod]=0; while(!pq.empty()){ auto [u,dst]=pq.top(); pq.pop(); if(path[u]<dst) continue; for(auto [vec,w] : G[u]) if(path[vec]>path[u]+w){ path[vec]=path[u]+w; pq.push({vec,path[vec]}); } } } long long dist1[MAX],dist2[MAX],dist3[MAX],dist4[MAX]; bool activ[MAX]; vector<int>DAG[MAX]; void build_DAG(){ long long total_len=dist1[nod2]; int i; for(i=1;i<=n;++i) if(dist1[i]+dist2[i]==total_len) activ[i]=1; for(i=1;i<=m;++i){ auto [u,v,w]=edge[i]; if(!activ[u] || !activ[v]) continue; if(dist1[u]>dist1[v]) swap(u,v); if(dist1[u]+w==dist1[v]) DAG[u].push_back(v); } } void minself(long long& x,long long val){ if(x>val) x=val; } bool viz[MAX]; long long min3[MAX],min4[MAX]; void dfs(int nod){ min3[nod]=dist3[nod]; min4[nod]=dist4[nod]; for(auto fiu : DAG[nod]){ if(!viz[fiu]) dfs(fiu); minself(min3[nod],min3[fiu]); minself(min4[nod],min4[fiu]); } minself(answer,dist3[nod]+min4[nod]); minself(answer,dist4[nod]+min3[nod]); viz[nod]=1; } int main() { read(); dijkstra(nod1,dist1); dijkstra(nod2,dist2); dijkstra(nod3,dist3); dijkstra(nod4,dist4); build_DAG(); answer=dist3[nod4]; dfs(nod1); cout<<answer; 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...