http://acm.hdu.edu.cn/showproblem.php?pid=1385
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 1001 5 using namespace std; 6 const int inf=9999999; 7 8 int g[maxn][maxn],tax[maxn],pre[maxn][maxn]; 9 int m,n,s,e; 10 11 void inti() 12 { 13 for(int i=1; i<=n; i++) 14 { 15 for(int j=1; j<=n; j++) 16 { 17 if(i==j) g[i][j]=0; 18 else g[i][j]=inf; 19 } 20 } 21 } 22 23 void floyd() 24 { 25 for(int k=1; k<=n; k++) 26 { 27 for(int i=1; i<=n; i++) 28 { 29 for(int j=1; j<=n; j++) 30 { 31 if(g[i][j]>(g[i][k]+g[k][j]+tax[k])) 32 { 33 g[i][j]=g[i][k]+g[k][j]+tax[k]; 34 pre[i][j]=pre[i][k]; 35 } 36 else if(g[i][j]==g[i][k]+g[k][j]+tax[k]) 37 { 38 if(pre[i][j]>pre[i][k]) 39 pre[i][j]=pre[i][k]; 40 } 41 } 42 } 43 } 44 } 45 46 int main() 47 { 48 while(scanf("%d",&n)!=EOF) 49 { 50 if(n==0) break; 51 inti(); 52 for(int i=1; i<=n; i++) 53 { 54 for(int j=1; j<=n; j++) 55 { 56 scanf("%d",&m); 57 if(m!=-1) 58 g[i][j]=m; 59 pre[i][j]=j; 60 } 61 } 62 for(int i=1; i<=n; i++) 63 { 64 scanf("%d",&tax[i]); 65 } 66 floyd(); 67 scanf("%d%d",&s,&e); 68 while(1) 69 { 70 if(s==-1&&e==-1) break; 71 printf("From %d to %d : ",s,e); 72 printf("Path: %d",s); 73 int s1=s; 74 while(s!=e) 75 { 76 printf("-->%d",pre[s][e]); 77 s=pre[s][e]; 78 } 79 printf(" "); 80 printf("Total cost : %d ",g[s1][e]); 81 scanf("%d %d",&s,&e); 82 printf(" "); 83 } 84 } 85 return 0; 86 }