Floyd。注意字典序!!!
1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAXNUM 55 5 #define INF 0x1fffffff 6 7 int cost[MAXNUM][MAXNUM]; 8 int path[MAXNUM][MAXNUM]; 9 int taxes[MAXNUM]; 10 int que[MAXNUM]; 11 int n; 12 13 void floyd(int n) { 14 int i, j, k, tmp; 15 16 for (i=1; i<=n; ++i) 17 for (j=1; j<=n; ++j) 18 path[i][j] = j; 19 20 for (k=1; k<=n; ++k) { 21 for (i=1; i<=n; ++i) { 22 for (j=1; j<=n; ++j) { 23 tmp = cost[i][k]+cost[k][j]+taxes[k]; 24 if (cost[i][j] > tmp) { 25 cost[i][j] = tmp; 26 path[i][j] = path[i][k]; 27 } else if (cost[i][j] == tmp) { 28 if (path[i][j] > path[i][k]) 29 path[i][j] = path[i][k]; 30 } 31 } 32 } 33 } 34 } 35 36 void output(int a, int b) { 37 int front, rear; 38 int x = a; 39 front = rear = 0; 40 41 //que[rear++] = a; 42 while (path[x][b] != b) { 43 que[rear++] = path[x][b]; 44 x = path[x][b]; 45 } 46 if (a != b) 47 que[rear++] = b; 48 49 printf("From %d to %d : ", a, b); 50 printf("Path: %d", a); 51 while (front < rear) 52 printf("-->%d", que[front++]); 53 printf(" Total cost : %d ", cost[a][b]); 54 } 55 56 int main() { 57 int a, b; 58 int i, j; 59 60 while (scanf("%d", &n)!=EOF && n) { 61 for (i=1; i<=n; ++i) 62 for (j=1; j<=n; ++j) { 63 scanf("%d", &cost[i][j]); 64 if (cost[i][j] < 0) 65 cost[i][j] = INF; 66 } 67 for (i=1; i<=n; ++i) 68 scanf("%d", &taxes[i]); 69 floyd(n); 70 while (1) { 71 scanf("%d %d", &a, &b); 72 if (a==-1 && b==-1) 73 break; 74 output(a, b); 75 } 76 } 77 78 return 0; 79 }