(Floyd求最短路)Minimum Transport Cost (hdu1385)
Description
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:
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.
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
Input
Output
Sample Input
Sample Output
Hint
#include <iostream>
using namespace std;
const int INF = 99999999;
const int maxn = 1000;
int n, s, e;
int path[maxn][maxn];
int b[maxn];
int rode[maxn][maxn];
int main()
{int i,j,k;
while(~scanf("%d", &n) && n)
{
for(i = 1; i <= n; ++i)
{
for(j = 1; j <= n; ++j)
{
scanf("%d", &path[i][j]);
if(path[i][j] == -1)
{
path[i][j] = INF;
}
rode[i][j] = j;
}
}
for(i = 1; i <= n; ++i)
{
scanf("%d", &b[i]);
}
for(k = 1; k <= n; ++k)
{
for( i = 1; i <= n; ++i)
{
for(j = 1; j <= n; ++j)
{
if(path[i][k]+path[k][j]+b[k] < path[i][j])
{
path[i][j] = path[i][k]+path[k][j]+b[k];
rode[i][j] = rode[i][k];
}
else if(path[i][j] == path[i][k]+path[k][j]+b[k] && rode[i][j] > rode[i][k])
{
rode[i][j] = rode[i][k];
}
}
}
}
while(~scanf("%d%d", &s, &e))
{
if(s == -1 && e == -1)
break;
printf("From %d to %d :\nPath: %d", s, e, s);
int u = s, v = e;
while(s != e)
{
printf("-->%d", rode[s][e]);
s = rode[s][e];
}
printf("\n");
printf("Total cost : %d\n\n", path[u][v]);
}
}
return 0;
}