用c语言编写,弗洛伊德算法,实现多源最短路径问题,并在代码中构建图
时间: 2024-10-21 16:15:55 浏览: 27
弗洛伊德算法,也称为Floyd-Warshall算法,是一种用于求解所有节点对之间的最短路径的动态规划方法。在C语言中,我们可以使用二维数组来存储图的邻接矩阵,并通过迭代更新每一层的距离来找出从任意节点到其他所有节点的最短路径。
以下是一个简单的C语言版本的弗洛伊德算法实现:
```c
#include <stdio.h>
#define V 5 // 图的顶点数
// 定义邻接矩阵,用-1表示未连接
int graph[V][V] = {
{0, -1, 4, -1, 0},
{-1, 0, -1, 8, -1},
{4, -1, 0, -1, 2},
{-1, 8, -1, 0, 7},
{0, -1, 2, 7, 0}
};
// 动态规划辅助函数,计算所有路径
void floyd(int dist[][V]) {
int i, j, k;
for (k = 0; k < V; ++k) {
for (i = 0; i < V; ++i) {
if (dist[i][k] != -1 && dist[k][j] != -1)
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
// 打印结果
void printSolution(int dist[][V]) {
printf("Minimum distances from %d to all vertices\n", 0);
for (int i = 0; i < V; ++i) {
printf("%d -> ", i);
for (int j = 0; j < V; ++j)
printf("%d ", dist[i][j]);
printf("\n");
}
}
int main() {
int dist[V][V];
// 初始化距离矩阵为无穷大(除了起点)
for (int i = 0; i < V; ++i)
for (int j = 0; j < V; ++j)
dist[i][j] = (i == j)? 0 : INT_MAX;
floyd(dist); // 运行弗洛伊德算法
printSolution(dist);
return 0;
}
```
在这个代码里,`graph[]`数组表示了图的邻接矩阵,初始值-1表示无边。`floyd()`函数通过三层循环更新距离矩阵,`printSolution()`则展示了最终的结果。
阅读全文