c语言编写一个程序实现求带权无向图中单源最短路径的迪克斯特拉算法
时间: 2024-03-16 13:41:29 浏览: 67
好的,以下是使用C语言编写的程序实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INF 0x3f3f3f3f
const int MAXN = 1005;
int n, m; // n表示顶点个数,m表示边数
int s, t; // s表示源点,t表示终点
int graph[MAXN][MAXN]; // 邻接矩阵存图
int dist[MAXN]; // 存储源点到各个点的最短距离
int vis[MAXN]; // 标记是否已访问
// 迪杰斯特拉算法
void dijkstra(int s) {
memset(dist, INF, sizeof(dist));
memset(vis, 0, sizeof(vis));
dist[s] = 0;
for (int i = 1; i <= n; i++) {
int k = -1, minn = INF;
for (int j = 1; j <= n; j++) {
if (!vis[j] && dist[j] < minn) {
k = j;
minn = dist[j];
}
}
if (k == -1) break;
vis[k] = 1;
for (int j = 1; j <= n; j++) {
if (!vis[j] && dist[k] + graph[k][j] < dist[j]) {
dist[j] = dist[k] + graph[k][j];
}
}
}
}
int main() {
scanf("%d %d %d %d", &n, &m, &s, &t);
memset(graph, INF, sizeof(graph));
for (int i = 1; i <= m; i++) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
graph[u][v] = graph[v][u] = w;
}
dijkstra(s);
printf("%d\n", dist[t]);
return 0;
}
```
程序中使用了邻接矩阵来存储图的信息。其中,`graph[i][j]`表示点i到点j的边的权值(如果不存在则为INF)。
在`dijkstra`函数中,首先将`dist`数组初始化为INF,并将源点s的距离设为0。然后对于每个未访问的点,找到距离源点最近的点k,并将其标记为已访问。然后遍历以k为起点的所有边,如果用k到v的距离加上源点到k的距离比源点到v的距离更小,则更新源点到v的距离。
最终,`dist[t]`即为源点s到终点t的最短路径长度。
需要注意的是,本程序中使用了一个`INF`常量表示正无穷,其值可以根据具体情况设置为一个足够大的数。
阅读全文