C语言单源最短路径算法代码(必须有每行注释)
时间: 2023-10-03 18:09:30 浏览: 34
以下是单源最短路径算法 Dijkstra 的 C 语言实现代码,每行都有注释说明:
```c
#include <stdio.h>
#include <stdbool.h>
// 用于表示无穷大,即表示两个节点之间没有边连接
#define INF 0x3f3f3f3f
// 用于存储图的邻接矩阵
int graph[MAX][MAX];
/**
* @brief 计算从起点 start 到各个节点的最短路径
*
* @param start 起点编号
* @param n 节点总数
* @param dist 用于存储起点到各个节点的最短距离
* @param visited 用于记录节点是否已被访问过
*/
void dijkstra(int start, int n, int dist[], bool visited[])
{
// 初始化
for (int i = 0; i < n; i++) {
dist[i] = graph[start][i];
visited[i] = false;
}
dist[start] = 0;
visited[start] = true;
// 计算最短路径
for (int i = 1; i < n; i++) {
int min_dist = INF, min_idx = -1;
// 找到距离起点最近的未访问节点
for (int j = 0; j < n; j++) {
if (!visited[j] && dist[j] < min_dist) {
min_dist = dist[j];
min_idx = j;
}
}
// 标记该节点已访问
visited[min_idx] = true;
// 更新与该节点相邻节点的距离
for (int j = 0; j < n; j++) {
if (!visited[j] && graph[min_idx][j] != INF) {
int new_dist = dist[min_idx] + graph[min_idx][j];
if (new_dist < dist[j]) {
dist[j] = new_dist;
}
}
}
}
}
int main()
{
// 节点总数和边总数
int n, m;
scanf("%d %d", &n, &m);
// 初始化邻接矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
graph[i][j] = INF;
}
}
// 读入边信息并更新邻接矩阵
for (int i = 0; i < m; i++) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
graph[u][v] = w;
}
// 计算最短路径
int start = 0;
int dist[MAX]; // 用于存储起点到各个节点的最短距离
bool visited[MAX]; // 用于记录节点是否已被访问过
dijkstra(start, n, dist, visited);
// 输出结果
for (int i = 0; i < n; i++) {
printf("%d ", dist[i]);
}
printf("\n");
return 0;
}
```
注:其中 `MAX` 表示节点最大数量,需要根据实际情况进行修改。