Submission #1182926

#TimeUsernameProblemLanguageResultExecution timeMemory
1182926WarinchaiCommuter Pass (JOI18_commuter_pass)C++20
15 / 100
619 ms68188 KiB
#include<bits/stdc++.h> #define int long long using namespace std; vector<pair<int,int>>adj[200005]; int dis[200005]; int inf=1e15; vector<int>back[200005]; int vis[200005]; int n,m; vector<pair<int,int>>edge; void dijkstra(int s){ priority_queue<pair<int,pair<int,int>>,vector<pair<int,pair<int,int>>>,greater<pair<int,pair<int,int>>>>pq; for(int i=1;i<=n;i++)dis[i]=inf; pq.push({0,{s,s}}); while(!pq.empty()){ auto [d,x]=pq.top(); int u=x.first; int p=x.second; pq.pop(); if(d<=dis[u])back[u].push_back(p); if(d>=dis[u])continue; dis[u]=d; for(auto x:adj[u]){ pq.push({x.second+d,{x.first,u}}); } } } int ndis[200005][2][2]; struct node{ int dis,use,on,u; node(int _dis,int _use,int _on,int _u){ dis=_dis,use=_use,on=_on,u=_u; } friend bool operator<(node a,node b){ return a.dis>b.dis; } }; void dijkstra2(int s){ priority_queue<node>pq; for(int i=1;i<=n;i++)ndis[i][0][0]=ndis[i][0][1]=ndis[i][1][1]=ndis[i][1][0]=inf; pq.push(node(0,0,0,s)); while(!pq.empty()){ auto x=pq.top(); pq.pop(); if(x.dis>=ndis[x.u][x.use][x.on])continue; ndis[x.u][x.use][x.on]=x.dis; //cerr<<x.u<<" "<<x.dis<<" "<<x.use<<" "<<x.on<<"\n"; for(auto v:adj[x.u]){ if(v.second==0){ if(x.use&&!x.on)continue; pq.push(node(x.dis+v.second,1,1,v.first)); }else{ pq.push(node(x.dis+v.second,x.use,0,v.first)); } } } //cerr<<"\n"; } void bt(int u,int s){ if(u==s)return; for(auto x:back[u]){ if(!vis[x])edge.push_back({x,u}),bt(x,u),vis[x]=1; } } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin>>n>>m; int s,t;cin>>s>>t; int u,v;cin>>u>>v; for(int i=0;i<m;i++){ int a,b,c;cin>>a>>b>>c; adj[a].push_back({b,c}); adj[b].push_back({a,c}); } dijkstra(s); //for(int i=1;i<=n;i++)cerr<<dis[i]<<" "; //cerr<<"\n"; vis[t]=1; bt(t,s); for(auto x:edge){ adj[x.first].push_back({x.second,0}); } int ans=inf; dijkstra2(u); //for(int i=1;i<=n;i++)cerr<<dis[i]<<" "; //cerr<<"\n"; ans=min({ans,ndis[v][0][0],ndis[v][0][1],ndis[v][1][0],ndis[v][1][1]}); dijkstra2(v); ans=min({ans,ndis[u][0][0],ndis[u][0][1],ndis[u][1][0],ndis[u][1][1]}); 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...