제출 #884795

#제출 시각아이디문제언어결과실행 시간메모리
884795tosivanmakCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
261 ms35016 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long vector<pair<ll,ll> >adj[200005]; ll dist[200005]; ll fromu[200005],fromv[200005],cop[200005]; bool visited[200005]; priority_queue<pair<ll,ll> >q; ll ans[200005],ans2[200005]; ll stdist,uvdist; void D(ll s){ dist[s]=0; q.push({0,s}); while(!q.empty()){ pair<ll,ll>lol=q.top(); q.pop(); if(visited[lol.second]){ continue; } visited[lol.second]=true; for(auto u: adj[lol.second]){ if(dist[lol.second]+u.second<dist[u.first]){ dist[u.first]=dist[lol.second]+u.second; q.push({-dist[u.first],u.first}); } } } } void D2(ll s){ dist[s]=0; q.push({0,s}); while(!q.empty()){ pair<ll,ll>lol=q.top(); q.pop(); if(visited[lol.second]){ continue; } visited[lol.second]=true; ans[lol.second]=min(ans[lol.second],fromu[lol.second]); for(auto u: adj[lol.second]){ if(dist[lol.second]+u.second==dist[u.first]){ ans[u.first]=min(ans[u.first],ans[lol.second]); } else if(dist[lol.second]+u.second<dist[u.first]){ dist[u.first]=dist[lol.second]+u.second; ans[u.first]=ans[lol.second]; q.push({-dist[u.first],u.first}); } } } } void D3(ll s){ dist[s]=0; q.push({0,s}); while(!q.empty()){ pair<ll,ll>lol=q.top(); q.pop(); if(visited[lol.second]){ continue; } visited[lol.second]=true; ans2[lol.second]=min(ans2[lol.second],fromu[lol.second]); for(auto u: adj[lol.second]){ if(dist[lol.second]+u.second==dist[u.first]){ ans2[u.first]=min(ans2[u.first],ans2[lol.second]); } else if(dist[lol.second]+u.second<dist[u.first]){ dist[u.first]=dist[lol.second]+u.second; ans2[u.first]=ans2[lol.second]; q.push({-dist[u.first],u.first}); } } } } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); ll n,m,s,t,u,v; cin>>n>>m>>s>>t>>u>>v; ll a[m+5],b[m+5],c[m+5]; for(int i=1;i<=m;i++){ cin>>a[i]>>b[i]>>c[i]; adj[a[i]].push_back({b[i],c[i]}); adj[b[i]].push_back({a[i],c[i]}); } for(int i=1;i<=n;i++){ dist[i]=1e17; visited[i]=false; } D(u); uvdist=dist[v]; for(int i=1;i<=n;i++){ fromu[i]=dist[i]; // cout<<dist[i]<<" "; dist[i]=1e17; visited[i]=false; } // cout<<'\n'; D(v); for(int i=1;i<=n;i++){ fromv[i]=dist[i]; // cout<<dist[i]<<" "; dist[i]=1e17; visited[i]=false; } for(int i=1;i<=n;i++){ ans[i]=1e17; ans2[i]=1e17; // cout<<ans[i]<<" "; } D2(s); stdist=dist[t]; for(int i=1;i<=n;i++){ cop[i]=dist[i]; dist[i]=1e17; visited[i]=false; } D3(t); // cout<<uvdist<<'\n'; for(int i=1;i<=n;i++){ if(cop[i]+dist[i]==stdist){ // cout<<i<<" "<<cop[i]<<" "<<dist[i]<<" "; // cout<<ans[i]<<" "<<fromv[i]<<'\n'; uvdist=min(uvdist,min(ans[i],ans2[i])+fromv[i]); // cout<<i<<" "; } } // for(int i=1;i<=n;i++){ // cout<<ans[i]<<" "<<ans2[i]<<"\n"; // } cout<<uvdist<<'\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...