货物运输
时间限制:1000 ms | 内存限制:65535 KB
难度:4
-
描述
-
S国有n个城市,从a城到b城运货的花费有两部分组成:
(1)a城到b城的运输费
(2)途径城市的税收
例如:a 运货到 b,走路线a —> i —> j —> b ,总花费为a 到 i ,i 到 j,j 到 b 的运输费、i,j 城市的税收之和。
已知任意两个城市的运输费用,每个城市的税收,计算出,城市a到b的最小运输费。
-
输入
-
多组数据。
第一行输入整数n(n不大于200,城市从1开始编号)
接下来输入n行n列的矩阵M,Mij 表示 i 城市到 j 城市的运输费,-1表示这两个城市不能直接到达。
第n+2 行 输入n个整数,第i个整数代表第i个城市的税收。
第n+3 行 输入整数m,表示有m次询问(m不大于200)。
接下来m行,每行输入两个整数u, v。
输出 -
对于每次询问
输出如下:
From u to v :
Path: u-->c1-->......-->ck-->v
Total cost :
............
From e to f :
Path: e-->e1-->..........-->ek-->f
Total cost : ......
Note: 如果有多种路径方案,输出字典序最小的,每次询问后加一个换行。a城市到a城市的运费不一定为0
样例输入 -
4 0 5 15 -1 5 0 5 8 15 10 2 5 -1 -1 8 0 5 3 7 1 3 1 3 2 4 3 1
样例输出 -
From 1 to 3 : Path: 1-->2-->3 Total cost : 13 From 2 to 4 : Path: 2-->4 Total cost : 8 From 3 to 1 : Path: 3-->1 Total cost : 15
解题思路:Floyd+路径输出
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 200; const int inf = 0x3f3f3f3f; int n,m,dis[maxn][maxn],tax[maxn]; int path[maxn][maxn]; // 用path[i][j] 记录路径i-->j的i的下一个经过的节点。 // 这样的话,如果说一条路径是这样的: i->a->b->j // 那path的值就是: path[i][j] = a , path[a][j] = b , path[b][j] = j; void floyd() { for(int k = 1; k <= n; k++) for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) { if(dis[i][j] > dis[i][k] + dis[k][j] + tax[k]) { path[i][j] = path[i][k]; dis[i][j] = dis[i][k] + dis[k][j] + tax[k]; } else if(dis[i][j] == dis[i][k] + dis[k][j] + tax[k]) { if(path[i][j] > path[i][k]) path[i][j] = path[i][k]; } } } int main() { int a,b; while(scanf("%d",&n)!=EOF) { for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) { scanf("%d",&dis[i][j]); if(dis[i][j] != -1) path[i][j] = j; else dis[i][j] = inf; } for(int i = 1; i <= n; i++) scanf("%d",&tax[i]); floyd(); scanf("%d",&m); while(m--) { scanf("%d %d",&a,&b); printf("From %d to %d :\n", a, b); if(a == b) printf("Path: %d\n", a); else { printf("Path: %d-->", a); int next = path[a][b]; while(next != b) { printf("%d-->", next); next = path[next][b]; } printf("%d\n",b); } printf("Total cost : %d\n", dis[a][b]); printf("\n"); } } return 0; }
-
多组数据。
本文介绍了一种使用Floyd算法解决货物运输中寻找最短路径的问题。通过实例详细展示了如何利用该算法来计算城市间的最小运输费用,并给出了完整的C++代码实现。

996

被折叠的 条评论
为什么被折叠?



