这两道是Floyd算法的模板题
第一道
九度的-1341
题目1341:艾薇儿的演唱会(40分)
题目描述:
艾薇儿今天来到了中国,她计划两天后在哈尔滨举行一场个人的演唱会。由于出现了紧急情况,演唱会的举办方要求艾薇儿提前举行演唱会。艾薇儿现在在北京,她需要找出一条从北京到哈尔滨耗时最短的线路,以便尽快到达哈尔滨。
中国的铁路线非常复杂,有很多条路线可以从北京到达哈尔滨。艾薇儿在网上找到了铁路线各个线路上所需花费的时间,但是她还是看不出来哪一条线路可以最快地到达哈尔滨。你有办法帮助艾薇儿找出从北京到哈尔滨所需的最短时间吗?找出来的人可以免费获得现场演唱会门票一张哦。
输入:
输入的第一行包括一个整数N(2<=N<=100),代表艾薇儿手上拿到的设有铁路站点的城市的个数,其中城市从1到n进行编号。以及M(1<=M<=1000),代表有M条铁路线路,每条铁路线路只连接两个城市。
接下来的一行有两个数,a和b(1<=a,b<=N),分别表示北京和哈尔滨的编号。
接下来有M行,每行有三个数x,y(1<=x,y<=N),t(1<=t<=1000),表示从城市x到城市y所需时间为t。
输出:
请输出艾薇儿从北京到哈尔滨最少需要多长时间。你可以放心地认为肯定存在一条路线可以从北京到哈尔滨。
样例输入:
3 4
1 3
1 2 1
3 2 3
2 3 4
3 1 8
样例输出:
4
提示:
1.火车能从城市x到城市y,就能从城市y到城市x,并且同一列火车来回所花费的时间是一样的。如果在x和y之间有不止一辆火车通行,则不同火车从x到y或者从y到x所花费的时间可能不相同。
2.虽然城市数有N个,但不保证所有的城市都能互相到达。可以保证的是,从北京到哈尔滨一定会有一条通路。
#include <cstdio>
#include <algorithm>
#define inf 9999999
using namespace std;
int i[300][300];
int n,m;
int Floyd(int x,int y)
{for(int a = 1; a <= n; a ++)for(int b = 1; b <= n; b ++)for(int c = 1; c <= n; c ++){if(i[b][c]>i[b][a]+i[a][c])i[b][c]=i[b][a]+i[a][c];}return i[x][y];
}
int main()
{int x,y,l;int m1,m2;int num;while(~scanf("%d%d",&n,&m)){for(int a = 1; a <= n; a ++)for(int b = 1; b <= n; b ++)i[a][b]=inf;for(int a = 1; a <= n; a ++)i[a][a]=0;scanf("%d%d",&m1,&m2);for(int a = 0; a < m; a ++){scanf("%d%d%d",&x,&y,&l);if(i[x][y]>l)i[x][y]=i[y][x]=l;}num=Floyd(m1,m2);printf("%d\n",num);}return 0;
}
第二道是HDOJ-1874
畅通工程续
Time Limit: 3000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0< N<200,0< M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B< N,A!=B,0< X< 10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T< N),分别代表起点和终点。
Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
Sample Input
3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2
Sample Output
2
-1
#include <cstdio>
#include <algorithm>
#define inf 9999999
using namespace std;
int i[300][300];
int n,m;
int Floyd(int x,int y)
{for(int a = 0;a < n;a ++)for(int b = 0;b < n;b ++)for(int c = 0;c < n;c ++){if(i[b][c]>i[b][a]+i[a][c])i[b][c]=i[b][a]+i[a][c];}if(i[x][y]==inf)return -1;elsereturn i[x][y];
}
int main()
{int x,y,l;int num;while(~scanf("%d%d",&n,&m)){for(int a = 0;a < n;a ++)for(int b = 0;b < n;b ++)i[a][b]=inf;for(int a = 0;a < n;a ++)i[a][a]=0;for(int a = 0;a < m;a ++){scanf("%d%d%d",&x,&y,&l);if(i[x][y]>l)i[x][y]=i[y][x]=l;}scanf("%d%d",&x,&y);num=Floyd(x,y);printf("%d\n",num);}return 0;
}