首页 > 代码库 > 【HDOJ】1385 Minimum Transport Cost

【HDOJ】1385 Minimum Transport Cost

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 :\n", a, b);
50     printf("Path: %d", a);
51     while (front < rear)
52         printf("-->%d", que[front++]);
53     printf("\nTotal cost : %d\n\n", 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 }