【BZOJ1880】【SDOI2009】Elaxia的路線
阿新 • • 發佈:2019-02-16
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> using namespace std; const int N=1510; int pre[N*N],last[N],other[N*N],w[N*N],num; int pre1[N*N],last1[N],other1[N*N],w1[N*N],num1; int dis[N],dist[N],diss[N],distt[N]; int n,m,ru[N],cnt; int s,t,ss,tt,ans; bool vis[N]; inline void add(int x,int y,int z){ num++; pre[num]=last[x]; last[x]=num; other[num]=y; w[num]=z; } inline void add1(int x,int y,int z){ num1++; pre1[num1]=last1[x]; last1[x]=num1; other1[num1]=y; w1[num1]=z; } inline void SPFA(int s,int *dis){ queue<int>q; memset(vis,0,sizeof(vis)); q.push(s); dis[s]=0; vis[s]=1; while(!q.empty()){ int u=q.front(); q.pop(); vis[u]=0; for(int i=last[u];i;i=pre[i]){ int v=other[i]; if(dis[v]>dis[u]+w[i]){ dis[v]=dis[u]+w[i]; if(!vis[v]){ vis[v]=1; q.push(v); } } } } } inline void tuopu(){ queue<int>q; memset(dis,0,sizeof(dis)); for(int i=1;i<=n;i++) if(ru[i]==0) q.push(i); while(!q.empty()){ int u=q.front(); q.pop(); for(int i=last1[u];i;i=pre1[i]){ int v=other1[i]; ru[v]--; dis[v]=dis[u]+w1[i]; if(ru[v]==0) q.push(v); } } for(int i=1;i<=n;i++) ans=max(ans,dis[i]); } int main(){ int x,y,z; scanf("%d%d",&n,&m); scanf("%d%d%d%d",&s,&t,&ss,&tt); for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&z); add(x,y,z);add(y,x,z); } memset(dis,127/3,sizeof(dis));memset(diss,127/3,sizeof(diss)); memset(dist,127/3,sizeof(dist));memset(distt,127/3,sizeof(distt)); SPFA(s,dis);SPFA(t,dist);SPFA(ss,diss);SPFA(tt,distt); //for(int i=1;i<=n;i++) cout<<dist[i]<<endl; for(int i=1;i<=n;i++){ for(int j=last[i];j;j=pre[j]){ int u=i,v=other[j]; //printf("dis[%d]=%d dist[%d]=%d w=%d ww=%d\n",u,dis[u],v,dist[v],w[j],dis[t]); if(dis[u]+dist[v]+w[j]==dis[t]){ if((diss[u]+distt[v]+w[j]==diss[tt])||(diss[v]+distt[u]+w[j]==diss[tt])){ add1(u,v,w[j]);ru[v]++; } } } } tuopu(); printf("%d\n",ans); return 0; }