最短路问题

2478: 最短路问题

Time Limit: 5000MS Memory Limit: 65536KB
Total Submit: 16 Accepted: 3 Page View: 402
Submit  Status  Discuss
现在有n个城市,编号从1到n。现在已知从城市i到城市j需要走的时间为aij。M78要从城市1到城市n。M78有一个飞行符,飞行符可以使得他瞬间通过一条边或连续的两条边(连续走一条边或两条边的时间为0)。问,M78从城市1到城市n,最少花费的时间。
多组输入。每组第一行有一个整数n,表示城市的数目。(2<=n<=1000)
接下来将输入一个n*n的矩阵。矩阵第i行第j列的数字aij表示从城市i到城市j,花费的时间为aij。(0<=aij<=10000 , aii=0 ,aij=aji)。如果aij=0,表示没有这条路。
每组输出一个数字,表示M78从城市1到城市n花费的最少时间。特别的,如果M78到不到了城市n,输出-1。
3
0 1 1
1 0 1
1 1 0

题中把图的构造直接告诉我们了,所以只需要用数组存起来直接用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][n]);
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值