HDU 1385 Minimum Transport Cost(Floyd + 打印路径)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1385
题意:先给你一张你n * n的图,代表城市间的距离,然后,给出n个tax的费用,然后很多询问,问你a到b的最少费用。。。。并且打印路径(字典序)。。。
注意tax的费用起点和终点不算。。。。。
开始是算吧起点和终点的费用都算上,最后减掉,这样是不能得到最少费用的。。。。后来想到在三重for里+上tax的费用。。。。就觉得这题完全是为了深刻理解Floyd而出的
然后到打印路径,用path[i][j]表示i到j这条最短路中i的直接后驱然后不断的记录直接后驱。。。。最后就可以把路径都纪录了
还有一点是如果起点 == 终点的时候 正确路径只有 一个点 而不是 a -- > a
代码:
#include <iostream> using namespace std; const int M = 500; const int INF = 1111111; int g[M][M]; int path[M][M]; int tax[M]; int main() { //printf("%d\n", INF); int n; while (~scanf("%d", &n), n) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { scanf("%d", &g[i][j]); if (g[i][j] == -1) { g[i][j] = INF; } path[i][j] = j;//初始化 } } for (int i = 1; i <= n; i++) { scanf("%d", tax + i); } for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if (g[i][j] > g[i][k] + g[k][j] + tax[k])//加了个tax费用 { g[i][j] = g[i][k] + g[k][j] + tax[k]; path[i][j] = path[i][k]; } else { if (g[i][j] == g[i][k] + g[k][j] + tax[k] && path[i][j] > path[i][k])//当路径相等的时候按字典序选择 { path[i][j] = path[i][k]; } } } } } int a, b; while (scanf("%d%d", &a, &b), (a != -1 || b != -1)) { printf("From %d to %d :\nPath: %d", a, b, a); int u = a, v = b; while (u != v)//起点等于终点的时候路径只有一个点 { printf("-->%d", path[u][v]); u = path[u][v]; } printf("\nTotal cost : %d\n\n", g[a][b]); } } return 0; }
posted on 2012-09-05 15:26 [S*I]SImMon_WCG______* 阅读(799) 评论(0) 编辑 收藏 举报