A - 畅通工程续

  题目:

 

 题目网址:Problem - 1874 (hdu.edu.cn)

   思路:

给定n个点,m条道路;求S,T之间的最短路径;

首先将道路数据存储在二维数组里,在进行初始化,

将所有道路都设为最大值,相同的设为0;

在输入道路信息,对应存入数组里;

在进行Floyd算法循环,对应S,T输出答案;

Floyd算法第一个for是循环公式里的k

d[i][j] = min(d[i][j], d[i][k]+d[k][j]);

后两个for是对数组进行遍历;

  代码实现:

#include <iostream>
#include <algorithm>
using namespace std;
#define inf 99999999
#define maxn 210
int maps[maxn][maxn];
int n,m;
 
int floyd(int s,int t)//Floyd算法循环
{
    for(int t=0;t<n;t++)
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(maps[i][j]>maps[i][t]+maps[t][j])//判断是否可以替换
                    maps[i][j]=maps[i][t]+maps[t][j];
    if(maps[s][t]==inf)//如果答案为无限大就返回-1
        return -1;
    else
        return maps[s][t];
}
 
int main()
{
    int a,b,x,s,t,ans;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)//对数组进行初始化,起点终点相同的为0,其他都为最大;
                maps[i][j]=(i==j?0:inf);
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&x);
            if(x<maps[a][b])//防止多次输入相同路径的不同权值,此处要保证输入权值为最小
                maps[a][b]=maps[b][a]=x;
        }
        scanf("%d %d",&s,&t);
        ans = floyd(s,t);
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2021-07-28 13:56  wateriness  阅读(29)  评论(0)    收藏  举报