Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4487 Accepted Submission(s): 1114
1 //转载 2 //路径存储的是前一个点的后继 3 #include <iostream> 4 #include <stdio.h> 5 #include <memory.h> 6 #include <queue> 7 using namespace std; 8 const int INF = 0x7fffff;//并不是整形最大值,防止溢出 9 const int N = 10000; 10 int map[N][N], tax[N], path[N][N]; 11 int n; 12 void init() 13 { 14 int i, j; 15 for(i = 1; i <= n; i++) 16 for(j = 1; j <= n; j++) 17 if(i == j) map[i][j] = 0; 18 else map[i][j] = INF; 19 } 20 void input() 21 { 22 int i, j, k; 23 for(i = 1; i <= n; i++) 24 for(j = 1; j <= n; j++) 25 { 26 scanf("%d", &k); 27 if(k != -1) map[i][j] = k; 28 path[i][j] = j; 29 } 30 for(i = 1; i <= n; i++) 31 scanf("%d", &tax[i]); 32 } 33 void floyd() 34 { 35 int i, j, k, len; 36 for(k = 1; k <= n; k++) 37 { 38 for(i = 1; i <= n; i++) 39 { 40 for(j = 1; j <= n; j++) 41 { 42 len = map[i][k] + map[k][j] + tax[k]; 43 if(map[i][j] > len) 44 { 45 map[i][j] = len; 46 path[i][j] = path[i][k]; //标记到该点的前一个点 47 } 48 else if(len == map[i][j]) //若距离相同 49 { 50 if(path[i][j] > path[i][k]) //判断是否为字典顺序 51 path[i][j] = path[i][k]; 52 } 53 } 54 } 55 } 56 } 57 void output() 58 { 59 int i, j, k; 60 while(scanf("%d %d", &i, &j)) 61 { 62 if(i == -1 && j == -1) break; 63 printf("From %d to %d :\n", i, j); 64 printf("Path: %d", i); 65 k = i; 66 while(k != j) //输出路径从起点直至终点 67 { 68 printf("-->%d", path[k][j]); 69 k = path[k][j]; 70 } 71 printf("\n"); 72 printf("Total cost : %d\n\n", map[i][j]); 73 } 74 } 75 int main() 76 { 77 while(scanf("%d", &n), n) 78 { 79 init(); 80 input(); 81 floyd(); 82 output(); 83 } 84 85 return 0; 86 } 87 /* 88 C语言,二维数组申请 89 int **map; 90 *map = (int *)malloc(sizeof(int)*(city)); 91 for(i=0;i<city;i++) 92 map[i] = (int *)malloc(sizeof(int)*city); 93 */