C语言单源最短路径算法代码(必须有每行注释)
时间: 2023-10-03 18:11:15 浏览: 42
以下是C语言单源最短路径算法的代码,每行都有注释解释代码的作用:
```c
#include<stdio.h>
#include<stdlib.h>
#define INF 0x3f3f3f3f // 定义无穷大
int n, m, s; // n表示图的节点数量,m表示图的边数量,s表示起点
int i, j, k; // 循环变量
int u, v, w; // u、v分别表示边的起点和终点,w表示边的权值
int dist[1005]; // 表示从起点到各个节点的最短距离
int vis[1005]; // 标记数组,标记节点是否被访问过
int map[1005][1005]; // 表示图的邻接矩阵
void dijkstra(int s) {
for (i = 1; i <= n; i++) {
dist[i] = INF; // 初始化起点到各个节点的距离为无穷大
vis[i] = 0; // 初始化标记数组
}
dist[s] = 0; // 起点到自身的距离为0
for (i = 1; i <= n; i++) {
int min = INF, u;
for (j = 1; j <= n; j++) {
if (!vis[j] && dist[j] < min) { // 找到距离起点最近的未访问节点
min = dist[j];
u = j;
}
}
vis[u] = 1; // 标记节点已经访问过
for (v = 1; v <= n; v++) {
if (!vis[v] && dist[u] + map[u][v] < dist[v]) { // 如果通过当前节点可以更新起点到v的最短距离
dist[v] = dist[u] + map[u][v]; // 更新起点到v的最短距离
}
}
}
}
int main() {
scanf("%d%d%d", &n, &m, &s); // 输入节点数量、边数量、起点
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
if (i == j) map[i][j] = 0; // 初始化自己到自己的距离为0
else map[i][j] = INF; // 初始化自己到其他节点的距离为无穷大
}
}
for (i = 1; i <= m; i++) {
scanf("%d%d%d", &u, &v, &w); // 输入边的起点、终点和权值
map[u][v] = w; // 更新邻接矩阵
}
dijkstra(s); // 进行最短路径算法
for (i = 1; i <= n; i++) {
printf("%d ", dist[i]); // 输出起点到各个节点的最短距离
}
return 0;
}
```
注:本代码实现了Dijkstra算法,使用邻接矩阵表示图,时间复杂度为O(n^2)。