TZOJ1049:杰西的问题 (Floyd最短路)

描述

众所周知,杰西住在城里,但他每周必须来下沙两次。路太长了,他走不了。但他如此坚决,没有什么能阻止他的到来。更何况,杰西要坐很多辆公共汽车来,路长不一样。所以,杰西想:我可以走最短的路来节省时间吗?

现在,问题摆在你身上,你能帮他算出最短的长度吗?

这简单吗?去做就对了!

输入

输入有几个测试用例。每个案例的第一行有两个数字 n,m (1 <= n,m <= 200 )。n 表示有 n 个巴士站 1th,2th,....nth 。m 表示有 m 条道路。然后接下来的 m 行,每行有 3 个整数 a,b,c,这意味着 a 和 b 公交车站之间的长度是 c(0 < c < 2000)。
然后一行有两个整数s,t,表示起点和终点汽车站。

输出

对于给定的起点和终点公交车站,输出一条线路中 s 和 t 之间的最短长度。
如果道路不存在,则输出-1。

样例输入

 

3 3
1 2 3
1 3 10
2 3 11
1 3
3 1
2 3 1
1 2

样例输出

10
-1

#include<bits/stdc++.h>
using namespace std;
int inf = 1e9+10;
int mapp[1001][1001];
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        for(int i=1;i<=n;i++) //初始化 
        {
            for(int j=1;j<=n;j++)
            {
                if(i==j) mapp[i][j] = 0;
                else mapp[i][j] = inf;
            }
        }
        int a,b,c;
        for(int i=1;i<=m;i++) //读入边
        {
            scanf("%d %d %d",&a,&b,&c);
            mapp[a][b] = mapp[b][a] = c; //将a,b两座城市联通 
            
        } 
        for(int k=1;k<=n;k++) //Floyd核心算法
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                {
                    if(mapp[i][j]>mapp[i][k]+mapp[k][j])
                        mapp[i][j] = mapp[i][k] + mapp[k][j];
                }
        int s,t;
        scanf("%d %d",&s,&t);
        printf("%d\n",mapp[s][t]==inf?-1:mapp[s][t]);
        
    }
     return 0;
}

 

posted @ 2022-09-26 17:10  CRt0729  阅读(28)  评论(0编辑  收藏  举报