題目描述
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.
輸入描述:
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:
輸出描述:
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.
輸入
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
輸出
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
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
#define maxn 50
#define INF 0xffffff
#define Min(a, b) (a > b ? b : a)
int map[maxn][maxn], n;
int patl[maxn][maxn];
int f[maxn];
void floyd();
int main()
{
while(cin >> n, n)
{
int i, j, a, b, next;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
cin >> map[i][j];
if(map[i][j] == -1)
map[i][j] = INF;
}
for(i=1; i<=n; i++)
cin >> f[i];
floyd();
while(cin >> a >> b, a != -1)
{
next = a;
printf("From %d to %d :\nPath: ", a, b);
while(next != b)
{
printf("%d-->", next);
next = patl[next][b];
}
printf("%d\n", next);
printf("Total cost : %d\n\n", map[a][b]);
}
}
return 0;
}
void floyd()
{
int k, i, j;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
patl[i][j] = j;
for(k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
int new_patl = map[i][k] + map[k][j] + f[k];
if(map[i][j] > new_patl)
{
map[i][j] = new_patl;
patl[i][j] = patl[i][k];
}
else if(map[i][j] == new_patl)
patl[i][j] = Min(patl[i][j], patl[i][k]);
}
}