您的位置:首页 > 其它

hdu 1385 Minimum Transport Cost

2013-09-07 15:02 246 查看
       
hdu 1385 Minimum Transport Cost

        Floyd最短路径和按字典序存放最短路径.

#include <stdio.h>

#define MAX 105
#define INF 0xffffff

int map[MAX][MAX];
int tax[MAX];
int path[MAX][MAX];
int n;

void floyd() {
int i, j, k;
int cost;

// 初始化路径, path[i][j]表示的是i到j要经过的路, 如path[1][3] = 5,表示1->3要经过5
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
path[i][j] = j;
}
}

// floyd
for (k = 1; k <= n; k++) {
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
cost = map[i][k] + map[k][j] + tax[k];
if (cost < map[i][j]) {
map[i][j] = cost;
path[i][j] = path[i][k];
} else if (cost == map[i][j]) { // 字典序
if (path[i][j] > path[i][k]) {
path[i][j] = path[i][k];
}
}
}
}
}
}

int main() {
int i, j;
int a, b;
int c, cur;

while (scanf("%d", &n) != EOF && n) {
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
scanf("%d", &c);
if (c == -1) {
map[i][j] = INF;
} else {
map[i][j] = c;
}
}
}

for (i = 1; i <= n; i++) {
scanf("%d", &tax[i]);
}

floyd();
while (scanf("%d%d", &a, &b)) {
if (a == -1 && b == -1) {
break ;
}

printf("From %d to %d :\n", a, b);
printf("Path: %d", a);
cur = a;
while (cur != b) {
printf("-->%d", path[cur][b]);
cur = path[cur][b];
}
printf("\nTotal cost : %d\n\n", map[a][b]);
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最短路径