B — 最短路
原题链接:https://vjudge.net/contest/351234#problem/B
题目大意:
有多个路口,一些路口间有多条路可通,走每条路都有一个通过时间,求起点到终点的最短时间。
题目分析:
这是单源最短路问题,一般用Bellman-Ford算法、Dijkstra算法,由于数据比较小,我使用了Floyd算法实现(因为最先接触)。
代码实现:
#include<iostream>
#include<cstdio>
#define INF 1000001
//Floyd算法
using namespace std;
int n, m, ans;
//路口间的距离
int dist[102][102];
int main()
{
int i, j ,k;
int a, b, c;
ans = 0;
while(true){
cin >> n >> m;
if(!n || !m) break;
//初始化
for(i=1; i<=n; i++){
for(j=1; j<=n; j++){
if(i == j) dist[i][j] = 0;
else dist[i][j] = INF;//初始化为互不可通
}
}
for(i=1; i<=m; i++){
cin >> a >> b >> c;
dist[a][b] = dist[b][a] = c; //a能到b,b也能到a的距离c
}
for(k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(j=1; j<=n; j++) //i能否通过k来确定i与j相通,并且更新最小距离
if(dist[i][j] > dist[i][k] + dist[k][j])
dist[i][j] = dist[i][k] + dist[k][j];
cout << dist[1][n] << endl;
}
return 0;
}
最后,希望路过的dl们能给予改进的建议!