编写一个C程序,运用Floyd算法,求任意图中任意两结点间的最短路径
时间: 2024-02-11 09:08:20 浏览: 19
好的,以下是一个使用Floyd算法求任意图中任意两结点间最短路径的C程序:
```C
#include <stdio.h>
#define INFINITY 9999
#define MAX_VERTEX_NUM 100
typedef struct {
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum; // 顶点数
} Graph;
void floyd(Graph G, int dist[][MAX_VERTEX_NUM]) {
int i, j, k;
for (i = 0; i < G.vexnum; i++) {
for (j = 0; j < G.vexnum; j++) {
dist[i][j] = G.arcs[i][j];
}
}
for (k = 0; k < G.vexnum; k++) {
for (i = 0; i < G.vexnum; i++) {
for (j = 0; j < G.vexnum; j++) {
if (dist[i][k] + dist[k][j] < dist[i][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}
}
int main() {
Graph G;
int i, j, dist[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
printf("请输入顶点数:");
scanf("%d", &G.vexnum);
printf("请输入邻接矩阵:\n");
for (i = 0; i < G.vexnum; i++) {
for (j = 0; j < G.vexnum; j++) {
scanf("%d", &G.arcs[i][j]);
if (G.arcs[i][j] == 0) {
G.arcs[i][j] = INFINITY;
}
}
}
floyd(G, dist);
printf("任意两节点间的最短路径为:\n");
for (i = 0; i < G.vexnum; i++) {
for (j = i+1; j < G.vexnum; j++) {
printf("%d -> %d 的最短路径长度为: %d\n", i, j, dist[i][j]);
}
}
return 0;
}
```
在这个程序中,我们首先定义了一个结构体 `Graph`,其中包含邻接矩阵 `arcs` 和顶点数 `vexnum`。然后,我们定义了一个 `floyd` 函数,用于实现Floyd算法。最后在主函数中,我们输入邻接矩阵,调用 `floyd` 函数求出任意两节点间的最短路径,并输出结果。
注意:此程序假设输入的邻接矩阵中,用 0 表示两个节点之间没有边,用一个较大的数(这里设为9999)表示两个节点之间没有直接连接的边。