本文主要是介绍最短路 floyed,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天开始学学最短路 现在从最开始的开始学 floyed(0(n3))
感觉floyed 有动态规划的思想
通过枚举来把到每个点的最小价格算出来 然后保存到数组中
上例题 hdu 1690 Bus System
Bus SystemTime 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.
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]); }}}
这篇关于最短路 floyed的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!