Bellman-Ford算法c语言具体实现
时间: 2023-12-14 13:40:04 浏览: 83
Bellman-Ford算法是一种用于解决最短路径问题的算法,可以处理带有负权边的图。以下是Bellman-Ford算法的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_NODES 1000
#define MAX_EDGES 100000
typedef struct {
int u;
int v;
int w;
} Edge;
int num_nodes, num_edges;
Edge edges[MAX_EDGES];
int dist[MAX_NODES];
void bellman_ford(int start) {
// 初始化距离为无穷大
for (int i = 0; i < num_nodes; i++) {
dist[i] = INT_MAX;
}
// 起点距离为0
dist[start] = 0;
// 进行num_nodes-1次松弛操作
for (int i = 1; i < num_nodes; i++) {
for (int j = 0; j < num_edges; j++) {
int u = edges[j].u;
int v = edges[j].v;
int w = edges[j].w;
if (dist[u] != INT_MAX && dist[u] + w < dist[v]) {
dist[v] = dist[u] + w;
}
}
}
// 检查是否存在负环
for (int i = 0; i < num_edges; i++) {
int u = edges[i].u;
int v = edges[i].v;
int w = edges[i].w;
if (dist[u] != INT_MAX && dist[u] + w < dist[v]) {
printf("Negative cycle detected\n");
return;
}
}
// 输出最短路径
for (int i = 0; i < num_nodes; i++) {
printf("dist[%d] = %d\n", i, dist[i]);
}
}
int main() {
scanf("%d%d", &num_nodes, &num_edges);
for (int i = 0; i < num_edges; i++) {
scanf("%d%d%d", &edges[i].u, &edges[i].v, &edges[i].w);
}
bellman_ford(0); // 从节点0开始
return 0;
}
```
在这个实现中,我们首先定义了一个Edge结构体来存储边的信息。我们还定义了一个dist数组,用来存储每个节点到起点的最短距离。在bellman_ford函数中,我们首先将所有的距离初始化为无穷大,然后将起点的距离设为0。接着,我们进行num_nodes-1次松弛操作,每次遍历所有的边,如果通过当前边可以更新目标节点的距离,则进行更新。最后,我们检查是否存在负环,如果存在,则输出提示信息,否则输出每个节点到起点的最短距离。在main函数中,我们读入图的信息,并从节点0开始执行Bellman-Ford算法。
阅读全文