#include<iostream>
#include<vector>
using namespace std;
const int maxn = 1010;
#define inf 0x1f1f1f1f
struct edges
{
int vexnums, edgenums;
int matrix[maxn][maxn];
}mat;
int minpath[maxn][maxn], path[maxn][maxn];
void Floyd(int u, int v)
{
for (int i = 1; i <= mat.vexnums; ++i) {
for (int j = 1; j <= mat.vexnums; ++j) {
minpath[i][j] = mat.matrix[i][j];
path[i][j] = -1; //初始化路径
}
}
for (int i = 1; i <= mat.vexnums; ++i) {
for (int j = 1; j <= mat.vexnums; ++j) {
for (int k = 1; k <= mat.vexnums; ++k) {
if (minpath[j][k] > minpath[j][i] + minpath[i][k]) {
minpath[j][k] = minpath[j][i] + minpath[i][k]; //更新最短路
path[j][k] = i; //记录最短路的顶点的上一个顶点
}
}
}
}
//输出path数组
//for (int i = 1; i <= mat.vexnums; ++i) {
// for (int j = 1; j <= mat.vexnums; ++j) {
// cout << path[i][j];
// }
// cout << endl;
//}
//输出最短路
if(minpath[u][v] == inf) cout << "从顶点" << u << "到顶点" << v << "没有路可走" << endl;
else {
vector<int> mypath;
cout << "从顶点" << u << "到顶点" << v << "的最短路径长度为:" << minpath[u][v] << endl;
cout << "路径为:";
while (v != -1) {
mypath.push_back(v);
v = path[u][v];
}
mypath.push_back(u);
for (int i = mypath.size()-1; i >=0; --i)
{
if (i == mypath.size() - 1) cout << mypath[i];
else cout << " -> " << mypath[i];
}
}
}
int main()
{
int n, m, u, v; cin >> n >> m >> u >> v; //输入顶点数和边数,欲求最短路的两个顶点
mat.edgenums = m; mat.vexnums = n;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (i == j) mat.matrix[i][j] = 0;
else mat.matrix[i][j] = inf;
}
}
for (int i = 0; i < m; ++i) {
int a, b, c; cin >> a >> b >> c;
mat.matrix[a][b] = mat.matrix[b][a] = c; //无向有权图
}
Floyd(u,v);
system("pause");
return 0;
}
弗洛伊德最小生成树
最新推荐文章于 2023-03-18 23:51:08 发布