请用c语言编程实现Dijkstra算法
时间: 2023-11-12 19:25:26 浏览: 78
Dijkstra算法是求解单源最短路径的一种贪心算法,具体步骤如下:
1. 将所有节点分为两部分:已确定最短路径的节点集合S和未确定最短路径的节点集合T;
2. 初始时,S只包含起点,T包含其余所有节点,各节点的最短路径长度为起点到该节点的距离;
3. 在T中选择距离起点最近的节点u,将其加入S中,并更新T中所有节点到起点的最短路径长度;
4. 重复步骤3,直到所有节点都在S中。
下面是用C语言实现Dijkstra算法的代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 1000
#define INF 0x3f3f3f3f
int n, m;
int dis[MAXN+5], vis[MAXN+5];
int edge[MAXN+5][MAXN+5];
void dijkstra(int s) {
memset(dis, INF, sizeof(dis));
memset(vis, 0, sizeof(vis));
dis[s] = 0;
for (int i = 1; i <= n; i++) {
int u = 0;
for (int j = 1; j <= n; j++) {
if (!vis[j] && (u == 0 || dis[u] > dis[j])) u = j;
}
vis[u] = 1;
for (int v = 1; v <= n; v++) {
if (!vis[v] && dis[v] > dis[u] + edge[u][v]) {
dis[v] = dis[u] + edge[u][v];
}
}
}
}
int main() {
scanf("%d%d", &n, &m);
memset(edge, INF, sizeof(edge));
for (int i = 1; i <= m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
edge[u][v] = w;
}
dijkstra(1);
for (int i = 1; i <= n; i++) {
printf("%d ", dis[i] == INF ? -1 : dis[i]);
}
return 0;
}
```
其中,dis数组用于存储起点到各节点的最短距离,vis数组用于记录节点是否已确定最短路径,edge数组用于存储边权,dijkstra函数用于执行Dijkstra算法,最后打印出起点到各节点的最短距离。
阅读全文