不使用#include <limits.h>并用c写一个迪杰斯特拉算法
时间: 2023-09-16 21:06:40 浏览: 77
用C语言写的迪杰斯特拉算法,
4星 · 用户满意度95%
以下是使用邻接矩阵实现的迪杰斯特拉算法的C语言代码:
```c
#define MAXN 1000 // 最大节点数
#define INF 0x7fffffff // 无穷大
int n; // 节点个数
int graph[MAXN][MAXN]; // 邻接矩阵表示图
int dist[MAXN]; // 存储源节点到各个节点的最短距离
bool vis[MAXN]; // 标记每个节点是否已经遍历过
void Dijkstra(int src) {
for (int i = 0; i < n; i++) {
dist[i] = INF; // 初始时将每个节点的距离设为无穷大
vis[i] = false; // 初始时每个节点都未被遍历过
}
dist[src] = 0; // 源节点到自身的距离为0
for (int i = 0; i < n; i++) {
int u = -1; // 找到未遍历过的距离最小的节点
for (int j = 0; j < n; j++) {
if (!vis[j] && (u == -1 || dist[j] < dist[u])) {
u = j;
}
}
vis[u] = true; // 标记该节点已被遍历过
for (int v = 0; v < n; v++) {
if (!vis[v] && graph[u][v] != INF) {
// 更新源节点到未遍历过的节点v的距离
dist[v] = min(dist[v], dist[u] + graph[u][v]);
}
}
}
}
```
其中,`n`表示节点个数,`graph`是邻接矩阵表示的图,`dist`数组存储源节点到各个节点的最短距离,`vis`数组用于标记每个节点是否已经遍历过。
迪杰斯特拉算法的实现主要分为两个步骤:
1. 初始化:将每个节点的距离设为无穷大,将每个节点都标记为未遍历过,将源节点到自身的距离设为0。
2. 遍历:从未遍历过的节点中找到距离最小的节点,将该节点标记为已遍历过,并更新源节点到未遍历过的节点的距离。
迪杰斯特拉算法的时间复杂度为O(n^2),可以通过使用优先队列将时间复杂度优化为O(nlogn)。
阅读全文