hdu 1385 Minimum Transport Cost【floyd过】【最短路】
来源:互联网 发布:网络直播游戏 编辑:程序博客网 时间:2024/05/18 05:28
Minimum Transport Cost
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9448 Accepted Submission(s): 2512
Problem Description
These are N cities in Spring country. Between each pair of cities there may be one transportation track or none. Now there is some cargo that should be delivered from one city to another. The transportation fee consists of two parts:
The cost of the transportation on the path between these cities, and
a certain tax which will be charged whenever any cargo passing through one city, except for the source and the destination cities.
You must write a program to find the route which has the minimum cost.
The cost of the transportation on the path between these cities, and
a certain tax which will be charged whenever any cargo passing through one city, except for the source and the destination cities.
You must write a program to find the route which has the minimum cost.
Input
First is N, number of cities. N = 0 indicates the end of input.
The data of path cost, city tax, source and destination cities are given in the input, which is of the form:
a11 a12 ... a1N
a21 a22 ... a2N
...............
aN1 aN2 ... aNN
b1 b2 ... bN
c d
e f
...
g h
where aij is the transport cost from city i to city j, aij = -1 indicates there is no direct path between city i and city j. bi represents the tax of passing through city i. And the cargo is to be delivered from city c to city d, city e to city f, ..., and g = h = -1. You must output the sequence of cities passed by and the total cost which is of the form:
The data of path cost, city tax, source and destination cities are given in the input, which is of the form:
a11 a12 ... a1N
a21 a22 ... a2N
...............
aN1 aN2 ... aNN
b1 b2 ... bN
c d
e f
...
g h
where aij is the transport cost from city i to city j, aij = -1 indicates there is no direct path between city i and city j. bi represents the tax of passing through city i. And the cargo is to be delivered from city c to city d, city e to city f, ..., and g = h = -1. You must output the sequence of cities passed by and the total cost which is of the form:
Output
From c to d :
Path: c-->c1-->......-->ck-->d
Total cost : ......
......
From e to f :
Path: e-->e1-->..........-->ek-->f
Total cost : ......
Note: if there are more minimal paths, output the lexically smallest one. Print a blank line after each test case.
Path: c-->c1-->......-->ck-->d
Total cost : ......
......
From e to f :
Path: e-->e1-->..........-->ek-->f
Total cost : ......
Note: if there are more minimal paths, output the lexically smallest one. Print a blank line after each test case.
Sample Input
5
0 3 22 -1 4
3 0 5 -1 -1
22 5 0 9 20
-1 -1 9 0 4
4 -1 20 4 0
5 17 8 3 1
1 3
3 5
2 4
-1 -1
0
Sample Output
From 1 to 3 :
Path: 1-->5-->4-->3
Total cost : 21
From 3 to 5 :
Path: 3-->4-->5
Total cost : 16
From 2 to 4 :
Path: 2-->1-->5-->4
Total cost : 17
5
0 3 22 -1 4
3 0 5 -1 -1
22 5 0 9 20
-1 -1 9 0 4
4 -1 20 4 0
5 17 8 3 1
1 3
3 5
2 4
-1 -1
0
Sample Output
From 1 to 3 :
Path: 1-->5-->4-->3
Total cost : 21
From 3 to 5 :
Path: 3-->4-->5
Total cost : 16
From 2 to 4 :
Path: 2-->1-->5-->4
Total cost : 17
1、这里我们更新的map【i】【j】代表过路费,不要忘记val【k】的存在、
2、输出路径:我们初始化路径path【i】【j】=j、当path【i】【j】路径经过点k松弛之后,path【i】【j】=path【i】【k】。
3、字典序输出:当map【i】【j】==map【i】【k】+map【k】【j】+val【k】的时候,当path【i】【j】>path【i】【k】的时候,更新path【i】【j】为path【i】【k】、保证了过路费最小且相等的时候,使得字典序最小。
floyd部分代码:
void floyd(){ for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int k=1;k<=n;k++) { if(a[j][k]>a[j][i]+a[i][k]+val[i])//更新最小权值 { a[j][k]=a[j][i]+a[i][k]+val[i]; path[j][k]=path[j][i];//更新路径 } else if(a[j][k]==a[j][i]+a[i][k]+val[i]&&path[j][k]>path[j][i]) { path[j][k]=path[j][i];//保证字典序 } } } }}
完整AC代码:
#include<stdio.h>#include<string.h>#include<vector>using namespace std;int a[1200][1200];int val[1200];int path[1200][1200];int n;void floyd(){ for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int k=1;k<=n;k++) { if(a[j][k]>a[j][i]+a[i][k]+val[i]) { a[j][k]=a[j][i]+a[i][k]+val[i]; path[j][k]=path[j][i]; } else if(a[j][k]==a[j][i]+a[i][k]+val[i]&&path[j][k]>path[j][i]) { path[j][k]=path[j][i]; } } } }}int main(){ while(~scanf("%d",&n)) { if(n==0)break; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { path[i][j]=j; scanf("%d",&a[i][j]); if(a[i][j]==-1)a[i][j]=0x3f3f3f3f; } } for(int i=1;i<=n;i++) { scanf("%d",&val[i]); } floyd(); int st,ed; /* for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { printf("%d ",path[i][j]); } printf("\n"); }*/ while(scanf("%d%d",&st,&ed)) { if(st==-1&&ed==-1)break; printf("From %d to %d :\n",st,ed); printf("Path: "); int u=st; printf("%d",u); while(u!=ed) { printf("-->%d",path[u][ed]); u=path[u][ed]; } printf("\nTotal cost : %d\n",a[st][ed]); printf("\n"); } }}
0 0
- hdu 1385 Minimum Transport Cost【floyd过】【最短路】
- HDOJ 1385 Minimum Transport Cost (最短路 Floyd & 路径记录)
- hdoj 1385 Minimum Transport Cost【最短路-->floyd】
- hdu 1385(zoj 1456)Minimum Transport Cost(最短路,输出路径,Floyd实现)
- HDU 1385 Minimum Transport Cost(Floyd 最短路 打印路径)
- hdu 1385 Minimum Transport Cost(最短路,floyd打印字典序路径)
- HDU 1385 Minimum Transport Cost(最短路Floyd+标记路径)
- Minimum Transport Cost hdu 1385(最短路 + 路径保存 + stack)
- HDU 1385 Minimum Transport Cost 最短路+字典序
- HDU 1385 Minimum Transport Cost (字典序打印最短路)
- HDU-1385 Minimum Transport Cost(最短路[Dijkstra])
- hdu 1385 Minimum Transport Cost(最短路+记录路径)
- hdu 1385 Minimum Transport Cost(最短路+输出路径)
- hdu 1385 Minimum Transport Cost 最短路加路径输出
- HDU 1385 Minimum Transport Cost【最短路之路径记录】
- HDU 1385Minimum Transport Cost 最短路输出路径
- HDU-1385-Minimum Transport Cost(floyd)
- hdu 1385 Minimum Transport Cost Floyd
- 《统计学习方法》——感知机与支持向量机
- Guava用法小计
- [leetcode] 39. Combination Sum
- 即时通讯之三
- Android Studio如何取消与SVN的关联
- hdu 1385 Minimum Transport Cost【floyd过】【最短路】
- css选择器
- android studio 搭载Git
- 模仿modal效果
- project源文件下没有其所包含的树目录所包含的树目录
- 特征值、特征向量的物理、几何意义
- 装机史
- create .mat file
- MFC(一):win32创建一个最简单的窗口