最短路 floyed

今天开始学学最短路 现在从最开始的开始学 floyed(0(n3))

感觉floyed 有动态规划的思想

通过枚举来把到每个点的最小价格算出来 然后保存到数组中

上例题 hdu 1690 Bus System

Bus System

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10298    Accepted Submission(s): 2810


 

Problem Description

Because of the huge population of China, public transportation is very important. Bus is an important transportation method in traditional public transportation system. And it’s still playing an important role even now.
The bus system of City X is quite strange. Unlike other city’s system, the cost of ticket is calculated based on the distance between the two stations. Here is a list which describes the relationship between the distance and the cost.
 



Your neighbor is a person who is a really miser. He asked you to help him to calculate the minimum cost between the two stations he listed. Can you solve this problem for him?
To simplify this problem, you can assume that all the stations are located on a straight line. We use x-coordinates to describe the stations’ positions.  

Input

The input consists of several test cases. There is a single number above all, the number of cases. There are no more than 20 cases.
Each case contains eight integers on the first line, which are L1, L2, L3, L4, C1, C2, C3, C4, each number is non-negative and not larger than 1,000,000,000. You can also assume that L1<=L2<=L3<=L4.
Two integers, n and m, are given next, representing the number of the stations and questions. Each of the next n lines contains one integer, representing the x-coordinate of the ith station. Each of the next m lines contains two integers, representing the start point and the destination.
In all of the questions, the start point will be different from the destination.
For each case,2<=N<=100,0<=M<=500, each x-coordinate is between -1,000,000,000 and 1,000,000,000, and no two x-coordinates will have the same value.

 

Output

For each question, if the two stations are attainable, print the minimum cost between them. Otherwise, print “Station X and station Y are not attainable.” Use the format in the sample.

 

Sample Input

 

2 1 2 3 4 1 3 5 7 4 2 1 2 3 4 1 4 4 1 1 2 3 4 1 3 5 7 4 1 1 2 3 10 1 4

 

Sample Output

 

Case 1: The minimum cost between station 1 and station 4 is 3. The minimum cost between station 4 and station 1 is 3. Case 2: Station 1 and station 4 are not attainable.

上代码:

#include<bits/stdc++.h>
using namespace std;
#define INF -1
long long int l1,l2,l3,l4,c1,c2,c3,c4,n,m,x,y,a[505],vis[505][505];
long long  check(long long int x)//按规则返回要用多少钱 
{
	if(x<=l1) return c1;
	else if(x<=l2) return c2;
	else if(x<=l3) return c3;
	else if(x<=l4) return c4;
	else return INF;
}
int main() 
{
	int t,l=1;
	cin>>t;
	while(t--)
	{
		cin>>l1>>l2>>l3>>l4>>c1>>c2>>c3>>c4;
		cin>>n>>m;
		for(int i=1;i<=n;i++)
		cin>>a[i];
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			vis[i][j]=INF;
		}//初始化 
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)//枚举 
		{
			if(i==j) vis[i][j]=0;//终点站与起点站一致就是没坐车 不用花钱 
			else vis[i][j]=check(abs(a[i]-a[j]));//要花的钱数 
		}
		for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			if(vis[i][k]!=INF&&vis[k][j]!=INF)//这条路可以走 不是死胡同 
			{
				if(vis[i][k]+vis[k][j]<vis[i][j]||vis[i][j]==-1)//i直接到j的价格比i到k再到j的价格大 或者 i不能直接到j  
				vis[i][j]=vis[i][k]+vis[k][j];//就把最小值赋给i到j的价格 
			}//从i到j的这个路程 选出最小的价格 
		}//有动态规划的思想 
		cout<<"Case "<<l++<<":"<<endl;
		while(m--)
		{
			cin>>x>>y;
			if(vis[x][y]==INF)//如果还是不能到达 
			printf("Station %d and station %d are not attainable.\n",x,y);
			else//能到达的最小路径 
			printf("The minimum cost between station %d and station %d is %I64d.\n",x,y,vis[x][y]);		
		}
	}
	
} 

猜你喜欢

转载自blog.csdn.net/tjndsg/article/details/88853821