Dijkstra算法求解无向图中的单源最短路径给出C语言代码
时间: 2023-12-01 11:07:36 浏览: 93
图论算法库 C++ 语言实现 代码内容 图论算法库,包括以下算法: 单源最短路径 Dijkstra 算法 单源最短路径 Bell
5星 · 资源好评率100%
下面是使用C语言实现Dijkstra算法求解无向图中的单源最短路径的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTICES 1000
#define INF INT_MAX
int graph[MAX_VERTICES][MAX_VERTICES];
int dist[MAX_VERTICES];
int visited[MAX_VERTICES];
int num_vertices;
void dijkstra(int src) {
// 初始化距离和visited数组
for (int i = 0; i < num_vertices; i++) {
dist[i] = INF;
visited[i] = 0;
}
dist[src] = 0;
// 执行num_vertices-1次迭代
for (int i = 0; i < num_vertices - 1; i++) {
// 选取距离源点最近的顶点
int min_dist = INF;
int u;
for (int j = 0; j < num_vertices; j++) {
if (!visited[j] && dist[j] < min_dist) {
min_dist = dist[j];
u = j;
}
}
// 将选中的顶点加入到visited集合中,并更新与其相邻的顶点的距离
visited[u] = 1;
for (int v = 0; v < num_vertices; v++) {
if (!visited[v] && graph[u][v] && dist[u] != INF && dist[u] + graph[u][v] < dist[v]) {
dist[v] = dist[u] + graph[u][v];
}
}
}
}
int main() {
// 读取图的信息
scanf("%d", &num_vertices);
for (int i = 0; i < num_vertices; i++) {
for (int j = 0; j < num_vertices; j++) {
scanf("%d", &graph[i][j]);
}
}
// 执行Dijkstra算法
dijkstra(0);
// 输出最短路径
for (int i = 0; i < num_vertices; i++) {
printf("Vertex %d, Distance: %d\n", i, dist[i]);
}
return 0;
}
```
其中,graph数组存储图的邻接矩阵,dist数组存储源点到各个顶点的距离,visited数组表示顶点是否已经加入到visited集合中。在main函数中,读入图的信息后,调用dijkstra函数求解最短路径,并输出结果。
阅读全文