您的位置:首页 > 其它

最短路问题

2015-11-11 09:05 204 查看


2478: 最短路问题

Time Limit:5000MS Memory Limit:65536KB

Total 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  floyd