图上每个点有一头牛,现在牛群聚集到点X上聚会,然后又回到各自的点,而且牛只走最短路径
问所有最短路中最长的一条( 路径包含来回)
正反跑一次
spfa(X) ,
spfa(i) , ans=max{ d0[i]+ dis[X] }
#include <iostream> #include <cstring> #include <queue> using namespace std ; const int N=1e6+2,M=5e6+2; const int inf=0x3f3f3f3f; int all,nxt[M],go[M],hd[N],w[M]; int dis[N],vis[N],n,m; int X; int d0[N]; void add(int x,int y,int z){ go[++all]=y; w[all]=z,nxt[all]=hd[x],hd[x]=all; } void spfa(int v0){ int i,x,y,z; queue<int> q; memset(vis,0,sizeof vis); for(i=0;i<=n+1;i++) dis[i]=inf; dis[v0]=0; q.push(v0); vis[v0]=1; while(!q.empty()){ x=q.front(),q.pop(); vis[x]=0; for(i=hd[x];i;i=nxt[i]){ y=go[i],z=w[i]; if(dis[y]>dis[x]+z){ dis[y]=dis[x]+z; if(!vis[y]) vis[y]=1,q.push(y); } } } } signed main(){ int i,x,y,z,m; scanf("%d%d%d",&n,&m,&X); for(i=1;i<=m;i++) scanf("%d%d%d",&x,&y,&z),add(x,y,z); spfa(X); memcpy(d0,dis,sizeof dis); int ans=0; for(i=1;i<=n;i++){ if(i==X) continue; spfa(i); ans=max(ans,d0[i]+dis[X]); } cout<<ans; }
标签:派对,10075,int,vis,spfa,3.2,include,hd,dis From: https://www.cnblogs.com/towboa/p/16882755.html