http://poj.org/problem?id=3268
把地图转置一下就OK。
#include<stdio.h> #include<string.h> #define INF 0xfffffff #define N 1005 int map1[N][N],map2[N][N],dis1[N],dis2[N],vis[N],n,m,x; void dijkstra() { int i,j,k,min; memset(vis,0,sizeof(vis)); vis[x]=1; for(i=1;i<=n;i++) dis1[i]=map1[x][i]; for(i=1;i<=n;i++) { min=INF; for(j=1;j<=n;j++) if(!vis[j]&&dis1[j]<min) { min=dis1[j]; k=j; } if(min==INF) break; vis[k]=1; for(j=1;j<=n;j++) if(!vis[j]&&dis1[j]>dis1[k]+map1[k][j]) dis1[j]=dis1[k]+map1[k][j]; } return; } int main(void) { int i,j,a,b,t,temp,max; while(scanf("%d%d%d",&n,&m,&x)!=EOF) { for(i=1;i<=N;i++) for(j=1;j<=N;j++) { map1[i][j]=INF; map2[i][j]=0; if(i==j) map1[i][j]=0; } while(m--) { scanf("%d%d%d",&a,&b,&t); map1[a][b]=t; } dijkstra(); for(i=1;i<=n;i++) dis2[i]=dis1[i]; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(!map2[i][j]&&!map2[j][i]) { temp=map1[i][j]; map1[i][j]=map1[j][i]; map1[j][i]=temp; map2[i][j]=map2[j][i]=1; } } } dijkstra(); max=0; for(i=1;i<=n;i++) { temp=dis1[i]+dis2[i]; if(temp>max) max=temp; } printf("%d\n",max); } return 0; }