任意两点间的最短路问题(Floyd-Warshall算法)

时间:2023-03-09 03:50:18
任意两点间的最短路问题(Floyd-Warshall算法)
 #define _CRT_SECURE_NO_WARNINGS
/*
7 10
0 1 5
0 2 2
1 2 4
1 3 2
2 3 6
2 4 10
3 5 1
4 5 3
4 6 5
5 6 9
0 6
*/
#include <iostream>
#include <vector>
#include <utility>
#include <queue>
#include <functional>
#include <algorithm>
#include <cstdio>
using namespace std; const int maxn = + ;
const int INF = ; int d[maxn][maxn]; //d[u][v]表示边e=(u,v)的权值(不存在时设为INF,不过d[i][j]=0)
int V, E; void input();
void warshall_floyd();
void init(); void init() {
for (int i = ; i < V; i++) {
for (int j = ; j < V; j++) {
if (i == j) {
d[i][j] = ;
}
else {
d[i][j] = INF;
}
}
}
} void input()
{
int s, t, ct;
for (int i = ; i < E; i++) {
cin >> s >> t >> ct;
d[s][t] = d[t][s] = ct;
}
} void warshall_floyd()
{
for (int k = ; k < V; k++) { //考虑经过顶点k和不经过顶点k的情况
for (int i = ; i < V; i++) {
for (int j = ; j < V; j++) {
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
}
}
} int main()
{
cin >> V >> E;
init(); //必须要初始化
input();
warshall_floyd();
int st, ov;
cin >> st >> ov; //输入起点终点
cout << d[st][ov] << endl;
return ;
}