对于一个4个顶点有向带权图,根据floyd算法写出任意两点之间的最短距离及路径的c++代码
时间: 2024-05-16 10:18:23 浏览: 115
以下是使用Floyd算法求解任意两点之间的最短路径的C++代码:
```C++
const int MAXN = 105;
const int INF = 0x3f3f3f3f;
int n; // 顶点数
int g[MAXN][MAXN]; // 带权邻接矩阵
int dist[MAXN][MAXN]; // 任意两点之间的最短距离
int path[MAXN][MAXN]; // 任意两点之间的最短路径
void floyd() {
// 初始化
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
dist[i][j] = g[i][j];
if (i != j && dist[i][j] < INF) {
path[i][j] = i;
} else {
path[i][j] = -1;
}
}
}
// Floyd算法核心代码
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; 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];
path[i][j] = path[k][j];
}
}
}
}
}
// 输出任意两点之间的最短距离和路径
void print_path(int u, int v) {
if (path[u][v] == -1) {
cout << "No path from " << u << " to " << v << endl;
return;
}
cout << "Shortest path from " << u << " to " << v << ": " << u;
while (u != v) {
u = path[u][v];
cout << " -> " << u;
}
cout << endl;
cout << "Shortest distance: " << dist[u][v] << endl;
}
```
其中,`g[i][j]`表示从顶点i到顶点j的边权值,`dist[i][j]`表示从顶点i到顶点j的最短距离,`path[i][j]`表示从顶点i到顶点j的最短路径上经过的最后一个节点。在算法的核心部分,我们遍历所有的三元组(i, j, k),并尝试更新dist[i][j]和path[i][j]的值。最后,当需要输出任意两点之间的最短路径时,我们可以通过回溯path矩阵来获取最短路径上的所有节点。
阅读全文