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
Path: 2-->1-->5-->4
Total cost : 17
题意:有N个城市 然后输入 每两个城市的要消耗的费用 的邻接矩阵(-1表示没有这条路),接着输入经过每个城市要交的税,然后输入多组起点和终点,求从起点到终点的最小费用并输出其路径(起点 终点不用交税)。
思路 :起点和终点不用交税 刚好对应floyd的插点思想: p=map[i][k]+map[k][j]+tax[k];
而记录路径的话 则需要二维数组记录 path[i][j]表示从i到j的要经过的第一个点。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define mm 105
#define maxx 11111111
using namespace std;
int map[mm][mm];
int path[mm][mm];
int tax[mm];
int m;
void floyd()
{
int i,j,k,p;
for(k=1; k<=m; k++)
{
for(i=1; i<=m; i++)
{
for(j=1; j<=m; j++)
{
p=map[i][k]+map[k][j]+tax[k];
if(p<map[i][j]) //插点法
{
map[i][j]=p;
path[i][j]=path[i][k];
}
else if(p==map[i][j]&&path[i][j]>path[i][k]) //字典序
{
path[i][j]=path[i][k];
}
}
}
}
return ;
}
int main()
{
int i,j;
while(~scanf("%d",&m))
{
if(m==0)
break;
memset(path,0,sizeof(path));
for(i=1; i<=m; i++)
for(j=1; j<=m; j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==-1)
map[i][j]=maxx;
else
path[i][j]=j;
}
for(i=1; i<=m; i++)
scanf("%d",&tax[i]);
floyd();
int a,b;
while(~scanf("%d%d",&a,&b))
{
if(a==-1&&b==-1)
break;
printf("From %d to %d :\n",a,b);
printf("Path: %d",a);
int d=a;
while(d!=b)
{
printf("-->%d",path[d][b]);
d=path[d][b];
}
cout<<endl<<"Total cost : "<<map[a][b]<<endl<<endl;
}
}
return 0;
}