用c语言写个dijkstra算法求无向网中的最短路径
时间: 2023-08-21 21:02:36 浏览: 86
Dijkstra最短路径算法(C语言实现)
5星 · 资源好评率100%
好的,下面是用C语言实现Dijkstra算法的代码,可以求解无向网中的最短路径:
```c
#include <stdio.h>
#define MAX 1000
#define INF 0x3f3f3f3f
int graph[MAX][MAX]; // 存储图的邻接矩阵
int dist[MAX]; // 存储起点到各个点的最短距离
int visited[MAX]; // 标记某个节点是否已经被访问过
void dijkstra(int start, int n) {
int i, j, min, u;
// 初始化
for (i = 1; i <= n; i++) {
visited[i] = 0;
dist[i] = graph[start][i]; // 初始化起点到各个点的距离
}
visited[start] = 1;
dist[start] = 0;
// n-1次循环,每次找出一个距离起点最近的未访问过的节点
for (i = 1; i < n; i++) {
min = INF;
for (j = 1; j <= n; j++) {
if (!visited[j] && dist[j] < min) {
min = dist[j];
u = j;
}
}
visited[u] = 1;
// 更新起点到其他节点的距离
for (j = 1; j <= n; j++) {
if (!visited[j] && graph[u][j] != INF && dist[u] + graph[u][j] < dist[j]) {
dist[j] = dist[u] + graph[u][j];
}
}
}
}
int main() {
int n, m, i, j, u, v, w, start;
// 输入节点数和边数
printf("请输入节点数和边数:\n");
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;
graph[v][u] = w; // 无向图
}
// 输入起点
printf("请输入起点:\n");
scanf("%d", &start);
// 调用dijkstra算法
dijkstra(start, n);
// 输出结果
printf("起点到各个节点的最短距离为:\n");
for (i = 1; i <= n; i++) {
printf("%d ", dist[i]);
}
printf("\n");
return 0;
}
```
上述代码实现了Dijkstra算法,可以求解无向图中的最短路径。其中,图的邻接矩阵存储在二维数组`graph`中,起点到各个节点的最短距离存储在一维数组`dist`中。程序运行的过程中,会先输入图的信息,然后输入起点,最终输出起点到各个节点的最短距离。
阅读全文