用C++写一个弗洛伊德算法求一个无向部分联通图两个顶点间的最短路径
时间: 2024-03-17 11:45:32 浏览: 82
好的,这个问题我可以回答。以下是使用C++编写的弗洛伊德算法实现部分联通图两个顶点之间的最短路径:
```c++
#include <iostream>
#include <limits.h>
using namespace std;
// 定义最大顶点数
#define MAX_V 100
// 定义无穷大
#define INF INT_MAX
// 定义图的邻接矩阵
int graph[MAX_V][MAX_V];
// 定义顶点数和边数
int V, E;
// 弗洛伊德算法函数
void floyd_warshall() {
// 初始化距离矩阵
int dist[MAX_V][MAX_V];
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
dist[i][j] = graph[i][j];
}
}
// 计算最短路径
for (int k = 0; k < V; k++) {
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
if (dist[i][k] != INF && dist[k][j] != INF && dist[i][j] > dist[i][k] + dist[k][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}
// 输出结果
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
if (dist[i][j] == INF) {
cout << "INF ";
} else {
cout << dist[i][j] << " ";
}
}
cout << endl;
}
}
int main() {
// 输入数据
cin >> V >> E;
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
if (i == j) {
graph[i][j] = 0;
} else {
graph[i][j] = INF;
}
}
}
for (int i = 0; i < E; i++) {
int u, v, w;
cin >> u >> v >> w;
graph[u][v] = w;
graph[v][u] = w;
}
// 调用弗洛伊德算法函数
floyd_warshall();
return 0;
}
```
在这个代码中,我们首先定义了一个邻接矩阵表示无向图,然后使用弗洛伊德算法计算最短路径。弗洛伊德算法的核心是三重循环,分别遍历所有的顶点、中间节点和目标节点,通过比较当前距离和经过中间节点的距离来更新最短距离。最后,我们输出距离矩阵即可。
阅读全文