嘿嘿,跟pku 1151 差不多,都是单源最短路,这次求的是每个点往返最短时间中的最大值,就是先按pku1151一样,求往返俩次的最短路,再求出最大值即可
代码基本没怎么改
#include <iostream> #include<string> #include<stdlib.h> using namespace std; const int MAX = 1010; const int inf = INT_MAX; int N,m,n,num,s; typedef struct vol { int w,//当前位置 v,//价值 value next;//下一结点的位置 } Voll; Voll peo[MAX*200]; bool vis[MAX]; int start1[MAX], start2[MAX]; int stack[MAX]; int dis1[MAX],dis2[MAX]; // dis[i] 从1即到i当前最短路 void SPFA( int startt[],int dis[]) { int i,top=0,temp; temp = s; for(i=0;i<n+1;i++) { dis[i] = inf; } memset(vis,false,sizeof(vis)); dis[temp] = 0; stack[++top] = temp; vis[temp]=true; while(top) { temp =stack[top--];vis[temp]=false; for(i=startt[temp]; i!=-1; i=peo[i].next) { if(peo[i].v + dis[temp] < dis[peo[i].w]) { dis[peo[i].w] = peo[i].v + dis[temp]; if(!vis[peo[i].w]) { vis[peo[i].w]=true; stack[++top] = peo[i].w; } } } } } void init() { int i,x,y,v; num=0; memset(start1,-1,sizeof(start1)); memset(start2,-1,sizeof(start2)); for(i=0;i<m;i++) { scanf("%d %d %d",&x,&y,&v); peo[num].w = y; peo[num].v = v; peo[num].next = start1[x]; //保存邻接表串的始端位置,逆向实现相当给力!!! start1[x] = num++; ///反向 peo[num].w = x; peo[num].v = v; peo[num].next = start2[y]; start2[y] = num++; } } int main() { while( scanf("%d %d %d", &n, &m,&s)==3) { init(); SPFA(start1,dis1) ; SPFA(start2,dis2); int max1=-inf; for(int i=1;i<n+1;i++) { if(dis1[i]+dis2[i]>max1) max1=dis1[i]+dis2[i]; } cout<<max1<<endl; } return 0; }