请用c语言编程实现Floyd算法,要求可测试任意加权图
时间: 2024-03-10 10:50:08 浏览: 164
以下是使用C语言实现Floyd算法的代码,可以对任意加权图进行测试:
```c
#include <stdio.h>
#include <stdlib.h>
#define INF 99999
#define MAX_VERTEX_NUM 100
int dist[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int path[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
void floyd(int n) {
int i, j, k;
for (k = 0; k < n; k++) {
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (dist[i][k] + dist[k][j] < dist[i][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
path[i][j] = path[k][j];
}
}
}
}
}
int main() {
int n, m;
printf("请输入图的顶点数和边数:\n");
scanf("%d %d", &n, &m);
int u, v, w;
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (i == j) {
dist[i][j] = 0;
} else {
dist[i][j] = INF;
}
path[i][j] = j;
}
}
printf("请输入每条边的起点、终点和权重:\n");
for (i = 0; i < m; i++) {
scanf("%d %d %d", &u, &v, &w);
dist[u][v] = w;
}
floyd(n);
printf("任意两点之间的最短路径长度矩阵为:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%d ", dist[i][j]);
}
printf("\n");
}
printf("任意两点之间的最短路径如下所示:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%d -> %d: %d", i, j, i);
int k = path[i][j];
while (k != j) {
printf(" -> %d", k);
k = path[k][j];
}
printf(" -> %d\n", j);
}
}
return 0;
}
```
在上面的代码中,我们定义了一个 `dist` 数组和一个 `path` 数组,分别用于存储任意两点之间的最短路径长度和路径。在输入边的信息后,我们调用 `floyd` 函数进行计算,最终输出任意两点之间的最短路径长度矩阵和路径。
阅读全文