c语言实现迪杰斯特拉算法求最短路径
时间: 2023-06-23 07:47:40 浏览: 188
求最短路径(迪杰斯特拉算法).doc
下面是使用C语言实现Dijkstra算法求解最短路径的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTICES 10
int graph[MAX_VERTICES][MAX_VERTICES];
int dist[MAX_VERTICES];
int visited[MAX_VERTICES];
int minDistance() {
int minDist = INT_MAX, minIndex;
for (int i = 0; i < MAX_VERTICES; i++) {
if (!visited[i] && dist[i] <= minDist) {
minDist = dist[i];
minIndex = i;
}
}
return minIndex;
}
void dijkstra(int start) {
for (int i = 0; i < MAX_VERTICES; i++) {
dist[i] = INT_MAX;
visited[i] = 0;
}
dist[start] = 0;
for (int i = 0; i < MAX_VERTICES - 1; i++) {
int u = minDistance();
visited[u] = 1;
for (int v = 0; v < MAX_VERTICES; v++) {
if (!visited[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) {
dist[v] = dist[u] + graph[u][v];
}
}
}
}
int main() {
for (int i = 0; i < MAX_VERTICES; i++) {
for (int j = 0; j < MAX_VERTICES; j++) {
graph[i][j] = 0;
}
}
graph[0][1] = 4;
graph[0][2] = 2;
graph[1][3] = 5;
graph[2][1] = 1;
graph[2][3] = 8;
graph[2][4] = 10;
graph[3][4] = 2;
graph[4][3] = 6;
dijkstra(0);
for (int i = 0; i < MAX_VERTICES; i++) {
printf("Distance from 0 to %d: %d\n", i, dist[i]);
}
return 0;
}
```
在这个示例代码中,我们定义了一个10x10的二维数组`graph`,用于存储节点之间的距离,其中0表示两个节点之间没有边相连,正整数表示两个节点之间的距离。
在`dijkstra`函数中,我们先将所有节点的距离初始化为无穷大,然后将起点的距离初始化为0。接下来,我们循环执行`MAX_VERTICES - 1`次,每次选取当前未访问过的节点中距离起点最近的节点,然后将该节点标记为已访问过,并更新与该节点相邻的所有未访问过的节点的距离。
最后,在`main`函数中,我们定义了一个示例图,并调用`dijkstra`函数求解从起点0到每个节点的最短距离,并输出结果。
注意,这个示例代码中的实现仅适用于图中边的权重都为正数的情况。如果图中存在负权边,需要使用其他算法,如Bellman-Ford算法。
阅读全文