http://acm.hdu.edu.cn/showproblem.php?pid=1385
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #define INF 0x7fffff #define N 110 using namespace std; int dis[N][N],path[N][N],tax[N],n; void floyd() { int i,j,k,temp; for(i=1;i<=n;i++) for(j=1;j<=n;j++) path[i][j]=j; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) { temp=dis[i][k]+dis[k][j]+tax[k]; if(temp<dis[i][j]) { dis[i][j]=temp; path[i][j]=path[i][k]; } else if(temp==dis[i][j]) { if(path[i][j]>path[i][k]) path[i][j]=path[i][k]; } } } int main(void) { int i,j,dist,a,b,pos; while(scanf("%d",&n)&&n) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) { scanf("%d",&dist); if(dist==-1) dis[i][j]=INF; else dis[i][j]=dist; } for(i=1;i<=n;i++) scanf("%d",&tax[i]); floyd(); while(scanf("%d%d",&a,&b)!=EOF) { if(a==-1&&b==-1) break; printf("From %d to %d :\n",a,b); printf("Path: %d",a); pos=a; while(pos!=b) { printf("-->%d",path[pos][b]); pos=path[pos][b]; } printf("\n"); printf("Total cost : %d\n\n",dis[a][b]); } } return 0; }