J - 畅通工程续
题目描述
给出若干个城镇与若干条城镇间的道路的长度,求从指定城镇A到指定城镇B的最短路。
题目分析
由题意可知,这是一道多源最短路问题,套用Floyd算法即可。
值得注意的是,题目没有说两个城镇之间只建一条路,因此输入时要注意。
代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int dis[200][200];//采用邻接矩阵
int n,m,_start,_end;
const int MAX=1e9;
void init()//初始化
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j) dis[i][j]=0;
else dis[i][j]=MAX;
}
}
}
void floyd()
{
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
dis[j][i]=dis[i][j];
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
init();
for(int i=0;i<m;i++){
int a,b,temp;
scanf("%d%d%d",&a,&b,&temp);
//注意这两个城镇之间是否有更短的路了
if(dis[a][b]==MAX||dis[a][b]>temp){
dis[a][b]=temp;
dis[b][a]=temp;
}
}
floyd();
scanf("%d%d",&_start,&_end);
if(dis[_start][_end]==MAX) printf("-1\n");
else printf("%d\n",dis[_start][_end]);
}
return 0;
}