最短路问题
2015-11-11 09:05
204 查看
2478: 最短路问题
Time Limit:5000MS Memory Limit:65536KBTotal Submit:16 Accepted:3 Page
View:402
Submit Status Discuss
Description
现在有n个城市,编号从1到n。现在已知从城市i到城市j需要走的时间为aij。M78要从城市1到城市n。M78有一个飞行符,飞行符可以使得他瞬间通过一条边或连续的两条边(连续走一条边或两条边的时间为0)。问,M78从城市1到城市n,最少花费的时间。
Input
多组输入。每组第一行有一个整数n,表示城市的数目。(2<=n<=1000) 接下来将输入一个n*n的矩阵。矩阵第i行第j列的数字aij表示从城市i到城市j,花费的时间为aij。(0<=aij<=10000 , aii=0 ,aij=aji)。如果aij=0,表示没有这条路。
Output
每组输出一个数字,表示M78从城市1到城市n花费的最少时间。特别的,如果M78到不到了城市n,输出-1。
Sample
Input
Raw
3 0 1 1 1 0 1 1 1 0
Sample
Output
Raw
0
Submit Status Discuss
题中把图的构造直接告诉我们了,所以只需要用数组存起来直接用Floyd算法,就可以求得最短路径,不过之前我写错的地方是没注意到应该双向赋值。
#include <iostream>
#include<cstring>
#include<cstdio>
#define INF 9999999
using namespace std;
int main()
{
int n,m,a,b,w[105][105],len;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0||m==0)
break;
else
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
w[i][j]=(i==j?0:INF);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&len);
if(a != b && w[a][b] > len)
{
w[a][b]=len;
w[b][a]=len; //双向赋值
}
}
for(int k=1;k<=n;k++) //Floyd模板
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(w[i][j]>w[i][k]+w[k][j])
w[i][j]=w[i][k]+w[k][j];
}
printf("%d\n",w[1]
);
}
}
return 0;
}
相关文章推荐
- 封装好的Folyd建图,C++源码
- Six Degrees of Cowvin Bacon(最短路径floyd算法)
- 对Floyd算法的理解
- hdu 1869 六度分离 (floyd)
- hdu 2066 一个人的旅行(floyd)
- hdu 2544 最短路(简单的Floyd)
- hdu 4034 Graph (floyd)
- hdu 1217 Arbitrage (Floyd算法)
- poj 3660 Cow Contest (Floyd+思维)
- floyd—warshall
- 最短路(floyd) Cow Contest
- 最短路(floyd) Cow Hurdles
- (诡异Floyd&自环)MZ Training 2014 #15 E题(POJ 2240)
- hdu5418 最短哈密顿回路
- uva753 folyd EK算法
- poj 1125 Stockbroker Grapevine Floyd算法求各点之间的最短路
- UVa247 Floyd判断可达 深搜求环
- POJ 1125_Stockbroker Grapevine
- USACO Section 2.4 Cow Tours (Floyd+并查集)
- POJ 3660 Cow contests Floyd 传递闭包