hdoj1385 Minimum Transport Cost

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 8805    Accepted Submission(s): 2320

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.

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

本题的大意是个运送货物需要交两部分费用,过路费和过城市费,如输出样例输入5,然后输入一个5*5的矩阵代表过路费,再输入5个数,代表过城市费,要求花的费用最低,并输出行走路线。

#include<stdio.h>
#define INL 0x3f3f3f3f
#define min(a,b) (a)>(b)?(b):(a)
int x[100][101],n,f[100],path[100][100];
void floyd()
{
	int i,j,k;
	for(i=1;i<=n;i++)
		   for(j=1;j<=n;j++)
		    path[i][j]=j;
	for(k=1;k<=n;k++)
	   for(i=1;i<=n;i++)
	     for(j=1;j<=n;j++)
	        {
	        	int h=x[i][k]+x[k][j]+f[k];
	        	if(x[i][j]>h)
	        	{
	        		x[i][j]=h;
	        		path[i][j]=path[i][k];
	        	}
	        	else if(x[i][j]==h)
	        	path[i][j]=min(path[i][j],path[i][k]);
	        }
}
int main()
{
	while(scanf("%d",&n),n)
	{
		int i,j,k,a,b,c;
		for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
		{
			scanf("%d",&x[i][j]);
			     if(x[i][j]==-1)
			          x[i][j]=INL;
		}
			for(j=1;j<=n;j++)
			   scanf("%d",&f[j]);
			       floyd();
		while(scanf("%d%d",&b,&c),b!=-1)
		{
		      int w=b;
			printf("From %d to %d :\nPath: ",b,c);
				 while(w!=c)
				 {
				 	 printf("%d-->",w);
				 	 w=path[w][c];
				 }
		    printf("%d\n",w);
			printf("Total cost : %d\n\n",x[b][c]);
	        }
	}
	return 0;
} 

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-30 09:49:08

hdoj1385 Minimum Transport Cost的相关文章

HDU1385 Minimum Transport Cost 【Floyd】+【路径记录】

Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7496    Accepted Submission(s): 1918 Problem Description These are N cities in Spring country. Between each pair of cities

HDU1385 Minimum Transport Cost

Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9052    Accepted Submission(s): 2383 Problem Description These are N cities in Spring country. Between each pair of cities

HDU 1385 Minimum Transport Cost 最短路径题解

本题就是使用Floyd算法求所有路径的最短路径,并且需要保存路径,而且更进一步需要按照字典顺序输出结果. 还是有一定难度的. Floyd有一种很巧妙的记录数据的方法,大多都是使用这个方法记录数据的. 不过其实本题数据不是很大,一般太大的数据也无法使用Floyd,因为效率是O(N^3). 所以其实也可以使用一般的Floyd算法,然后增加个三维数组记录数据.下面就是这种做法,0ms过了. #include <stdio.h> #include <vector> using std::v

HDU 1385 Minimum Transport Cost(Floyd 最短路 打印路径)

HDU 1385 大意: 有N个城市,然后直接给出这些城市之间的邻接矩阵,矩阵中-1代表那两个城市无道路相连,其他值代表路径长度. 如果一辆汽车经过某个城市,必须要交一定的钱(可能是过路费). 现在要从a城到b城,花费为路径长度之和,再加上除起点与终点外所有城市的过路费之和. 求最小花费,如果有多条路经符合,则输出字典序最小的路径. 思路: Floyd求最短路,打印路径即可. 1 /*--------------------------------------------------------

zoj1456 Minimum Transport Cost

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1456 题目大意:有N个城市,两个城市之间要么有一条运输路线,要么没有.现在有一些货物需要从一个城市运往另一个城市.运输费用包含两部分:通过两个城市之间运输线路的费用,以及通过一个城市时的纳税(起点城市和目标城市除外).要求输出费用最小,并且路径字典需序最小的线路. 所谓字典序就是,如果有1-->2-->和1-->3两条路可选当输出1-->2-->3.

hdu Minimum Transport Cost(按字典序输出路径)

 摘自:Think In Java 从技术角度说,OOP(面向对象程序设计)只是涉及抽象的数据类型.继承以及多形性,但另一些问题也可能显得非常重要.本节将就这些问题进行探讨.最重要的问题之一是对象的创建及破坏方式.对象需要的数据位于哪儿,如何控制对象的"存在时间"呢?针对这个问题,解决的方案是各异其趣的.C++认为程序的执行效率是最重要的一个问题,所以它允许程序员作出选择.为获得最快的运行速度,存储以及存在时间可在编写程序时决定,只需将对象放置在堆栈(有时也叫作自动或定域变量)或者静态

hdu 1385 Minimum Transport Cost (Floyd + 字典序打印路径)

Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7822    Accepted Submission(s): 2028 Problem Description These are N cities in Spring country. Between each pair of cities

zoj 1456 Minimum Transport Cost (Floyd+路径记录)

Minimum Transport Cost Time Limit: 2 Seconds      Memory Limit: 65536 KB 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 t

HDOJ 1385 Minimum Transport Cost

Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7007    Accepted Submission(s): 1791 Problem Description These are N cities in Spring country. Between each pair of cities