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; }

浙公网安备 33010602011771号