nyoj 931 货物运输(Floyd输出路径)

货物运输

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 4
描述

S国有n个城市,从a城到b城运货的花费有两部分组成:

(1)a城到b城的运输费

(2)途径城市的税收

例如:运货到 b,走路线> i > j > b ,总花费为到 到 j到 的运输费、i城市的税收之和。

已知任意两个城市的运输费用,每个城市的税收,计算出,城市ab的最小运输费。

输入
多组数据。
第一行输入整数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
#include
#include
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;
}



你可能感兴趣的:(图论)