C语言给定带权无向图G和源点D,利用Dijkstra算法求源点D到其余各个顶点的最短距离的代码。
时间: 2024-02-09 18:09:51 浏览: 74
好的,下面是用C语言实现Dijkstra算法求解带权无向图G的源点D到其他顶点的最短距离的代码。在这个例子中,我们假设用邻接矩阵存储图。
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTICES 100
int graph[MAX_VERTICES][MAX_VERTICES];
int dist[MAX_VERTICES];
int visited[MAX_VERTICES];
// 找到距离源点最近的未访问顶点
int get_min_distance(int n)
{
int min_distance = INT_MAX;
int min_vertex = -1;
for (int i = 0; i < n; i++) {
if (!visited[i] && dist[i] < min_distance) {
min_distance = dist[i];
min_vertex = i;
}
}
return min_vertex;
}
void dijkstra(int start, int n)
{
// 初始化距离
for (int i = 0; i < n; i++) {
dist[i] = INT_MAX;
visited[i] = 0;
}
dist[start] = 0;
for (int i = 0; i < n - 1; i++) {
// 找到距离源点最近的未访问顶点
int u = get_min_distance(n);
// 标记该顶点为已访问
visited[u] = 1;
// 更新距离
for (int v = 0; v < n; 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()
{
int n, start;
printf("请输入顶点数和起点编号:");
scanf("%d %d", &n, &start);
printf("请输入邻接矩阵:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &graph[i][j]);
}
}
dijkstra(start, n);
printf("源点%d到各顶点的最短距离为:\n", start);
for (int i = 0; i < n; i++) {
printf("%d ", dist[i]);
}
return 0;
}
```
在上面的代码中,我们使用了一个get_min_distance函数来找到距离源点最近的未访问顶点。dijkstra函数则是实现了Dijkstra算法的核心部分。最后,我们在主函数中读入图和源点,并调用dijkstra函数即可输出源点D到其他顶点的最短距离。
阅读全文