写一个C程序,运用Folyd算法求图的最短路径
时间: 2024-02-28 13:57:57 浏览: 106
求最短路径的C程序
好的,以下是一份使用Floyd算法求图的最短路径的C语言代码示例:
```c
#include <stdio.h>
#define MAX_NODE 100 // 最大节点数
#define INF 99999999 // 无穷大
int graph[MAX_NODE][MAX_NODE]; // 存储图的邻接矩阵
int path[MAX_NODE][MAX_NODE]; // 存储路径
// Floyd算法求最短路径
void floyd(int n) {
int i, j, k;
// 初始化路径和距离矩阵
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
path[i][j] = -1;
if (i == j) {
graph[i][j] = 0;
}
}
}
// Floyd算法核心代码
for (k = 1; k <= n; k++) {
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
if (graph[i][j] > graph[i][k] + graph[k][j]) {
graph[i][j] = graph[i][k] + graph[k][j];
path[i][j] = k;
}
}
}
}
}
// 输出最短路径
void print_path(int start, int end) {
if (path[start][end] == -1) {
printf("%d", start);
} else {
print_path(start, path[start][end]);
printf(" -> %d", path[start][end]);
print_path(path[start][end], end);
}
}
int main() {
int n, m, i, j, u, v, w;
printf("请输入节点数和边数:");
scanf("%d%d", &n, &m);
// 初始化邻接矩阵
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
if (i == j) {
graph[i][j] = 0;
} else {
graph[i][j] = INF;
}
}
}
// 读入边权值
printf("请输入边的起点,终点和权值:\n");
for (i = 1; i <= m; i++) {
scanf("%d%d%d", &u, &v, &w);
graph[u][v] = w;
}
// Floyd算法求最短路径
floyd(n);
// 输出最短路径
printf("请输入起点和终点:");
scanf("%d%d", &u, &v);
printf("最短路径为:");
print_path(u, v);
printf("\n");
return 0;
}
```
在这个示例中,我们使用邻接矩阵来存储图,并使用Floyd算法来求出图的最短路径。该算法的时间复杂度为O(n^3),适用于节点数较少的情况。
阅读全文