【算法】单源最短路——Dijkstra

本文介绍了Dijkstra算法,一种用于求解单源最短路问题的常见算法。该算法采用贪心策略,从起点开始,逐步将最短路径可达的节点加入已知最短路径集合,不断更新最短距离。通过示例详细解释了算法过程,并给出了代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于固定起点的最短路算法,我们称之为单源最短路算法。单源最短路算法很多,最常见的就是dijkstra算法。

dijkstra主要用的是一种贪心的思想,就是说如果i...s...t...j是最短路,那么i和j之间的任意两点s,t之间也一定是最短路,非常好证,如果s,t之间不是最短路,那么必然存在最短路,那么i到j也不是最短路造成了矛盾。

而dijkstra就是运用这样的思想,把起点首先放进一个集合S中,其他的点在另一个集合中,每次取起点经过集合S中的点可达的最短路的点,加入到集合S中,并且根据新加入的店刷新一遍最短路。直到所有的点都在集合S中。


如上图,假设以1为起点,dis[i]为起点到i点的最短距离,如果没法直达则为INF

第一次:S中只有1,那么1能直达的点有2,3,取路径最短的3加入S,并更新一遍dis,发现6可达,dis[6] = 20;

第二次:S中有1,3,可达的有2,6,取2,则4,5可达,dis[4] = 21,dis[5] = 10;

第三次:S中有1,2,3,可达的有4,5,6,取5,到4多了新路径且比原来近,更新dis[4] = 13;

第四次:S中有1,2,3,5,可达的有4,6,取4,到6多了新路径且比原来近,更新dis[6] = 15;

第五次:S中有1,2,3,4,5,可达的有6,只有6不在S中,取6,不更新,完成算法


要注意的是外围循环是除了起点外的点数,如果多一次,pos会无法赋值因为所有的点都遍历过了,造成变量没有初始化而程序崩溃。

代码如下:

#include <
### 关于Dijkstra算法单源短路径 #### Dijkstra算法简介 Dijkstra算法是一种用于解决赋权图中单源短路径问题的经典算法。该算法能够有效地找到从指定起始顶点出发到达图中其它各顶点之间的短距离[^2]。 #### 基本原理 此算法的核心在于维护一个集合S,其中包含了已知其小路径长度的所有结点;以及另一个列表dist[]来记录当前所知道的从初始节点到各个目标节点间可能存在的短路程估计值。每次从未处理过的邻接点集中选取具有小临时标记值得那个作为新的永久成员加入到集合S里,并更新其余未访问过邻居们的预估值直到遍历完整张网状结构为止[^3]。 #### C语言实现示例 下面给出一段简单的C程序代码片段展示如何利用数组模拟优先队列执行上述过程: ```c #include <stdio.h> #define MAX 100 #define INF 999999 int n, m; int dist[MAX]; bool visited[MAX]; void dijkstra(int graph[][MAX], int src) { for (int i = 0; i < n; ++i) dist[i] = (src == i ? 0 : INF), visited[i] = false; for (int count = 0; count < n - 1; ++count) { int u = -1; for (int v = 0; v < n; ++v) if (!visited[v] && (u == -1 || dist[v] < dist[u])) u = v; visited[u] = true; for (int v = 0; v < n; ++v) if (!visited[v]) dist[v] = ((graph[u][v]) && dist[u] + graph[u][v] < dist[v] ? dist[u] + graph[u][v] : dist[v]); } } ``` 这段代码实现了经典的Dijkstra算法逻辑,在初始化阶段设定了除起点外所有位置的距离为无穷大(INF),并通过迭代不断寻找近可达但尚未被确认优路线的目的地来进行优化操作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值