标签:
Description
Input
Output
Sample Input
Sample Output
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 const int MAXINT = 1<<25; 5 int path[205][205]; 6 int num[205][205]; 7 int num1[205]; 8 int n; 9 void floyd() 10 { 11 for(int k=1 ; k<=n ; k++) 12 for(int i=1 ; i<=n ; i++) 13 for(int j=1 ; j<=n ; j++) 14 { 15 if(num[i][j] > (num[i][k]+num[k][j]+num1[k]) ) 16 { 17 num[i][j] = num[i][k]+num[k][j]+num1[k]; 18 path[i][j] = path[i][k]; 19 } 20 else if(num[i][j] == num[i][k]+num[k][j]+num1[k]) 21 { 22 if(path[i][j] > path[i][k]) 23 { 24 path[i][j] = path[i][k]; 25 num[i][j] = num[i][k]+num[k][j]+num1[k]; 26 } 27 }//attention 当存在多条最短路时,选取后驱小的路 28 } 29 } 30 void print(int a,int b) 31 { 32 if(a == b) 33 { 34 printf("%d\n",b); 35 return; 36 } 37 printf("%d-->",a); 38 a=path[a][b]; 39 print(a,b); 40 }//路径输出函数 41 42 int main() 43 { 44 int i,j,a,b; 45 while(scanf("%d",&n),n) 46 { 47 for(i=1 ; i<=n ; i++) 48 for(j=1 ; j<=n ; j++) 49 { 50 scanf("%d",&num[i][j]); 51 if(num[i][j]==-1) 52 num[i][j]=MAXINT; 53 path[i][j]=j;//记后驱,方便输出 54 } 55 for(i=1 ; i<=n ; i++) 56 scanf("%d",&num1[i]); 57 floyd(); 58 while(scanf("%d%d",&a,&b)) 59 { 60 if(a == -1 && b == -1) 61 break; 62 printf("From %d to %d :\n",a,b); 63 printf("Path: "); 64 print(a,b); 65 printf("Total cost : %d\n\n",num[a][b]); 66 } 67 } 68 return 0; 69 }
ACM学习之路___HDU 1385(带路径保存的 Floyd)
标签:
原文地址:http://www.cnblogs.com/x-1204729564/p/5685810.html