제출 #1110992

#제출 시각아이디문제언어결과실행 시간메모리
1110992haianhnguyen08102007Commuter Pass (JOI18_commuter_pass)C++11
100 / 100
274 ms69036 KiB
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=4e5+10; ll n,m,s,t,u,v,x[N],y[N],z[N],d1[N],d2[N],d3[N],d4[N],ans; struct graph { ll cnt,dis[N],head[N],in[N],mind[N],v[N],f[N]; struct Edge { ll nx,to,cost; }edg[N]; struct node { ll id,ans; bool operator < (const node &x)const { return x.ans<ans; } }; void add(int a,int b,int c) { edg[++cnt].to=b; edg[cnt].cost=c; edg[cnt].nx=head[a]; in[b]++; head[a]=cnt; } priority_queue<node> q; void dj(int s,ll dis[]) { for(int i=1;i<=n;i++)dis[i]=1ll*1e18; memset(v,0,sizeof(v)); dis[s]=0; q.push((node){s,0}); while(!q.empty()) { node temp=q.top(); q.pop(); ll u=temp.id; if(v[u])continue; v[u]=1; for(int j=head[u];j;j=edg[j].nx) { int to=edg[j].to; if(dis[to]>dis[u]+edg[j].cost) { dis[to]=dis[u]+edg[j].cost; if(!v[to])q.push((node){to,dis[to]}); } } } } void solve() { queue<int> q; for(int i=1;i<=n;i++) { mind[i]=d3[i]; if(!in[i])q.push(i); } while(!q.empty()) { int x=q.front();q.pop(); if(f[x])continue; f[x]=1; ans=min(ans,mind[x]+d4[x]); for(int j=head[x];j;j=edg[j].nx) { int v=edg[j].to; in[v]--;mind[v]=min(mind[v],mind[x]); if(!in[v])q.push(v); } } } }g1,g2,g3; int main() { ios::sync_with_stdio(0); cin>>n>>m>>s>>t>>u>>v; for(int i=1;i<=m;i++) { cin>>x[i]>>y[i]>>z[i]; g1.add(x[i],y[i],z[i]); g1.add(y[i],x[i],z[i]); } g1.dj(s,d1);g1.dj(t,d2);g1.dj(u,d3);g1.dj(v,d4); ans=d3[v]; for(int i=1;i<=m;i++) { if(d1[x[i]]+z[i]+d2[y[i]]==d1[t])g2.add(x[i],y[i],0),g3.add(y[i],x[i],0); else if(d1[y[i]]+z[i]+d2[x[i]]==d1[t])g2.add(y[i],x[i],0),g3.add(x[i],y[i],0); } g2.solve();g3.solve(); cout<<ans<<'\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...