最短路径搜索——Dijkstra

微信搜索:编程笔记本。获取更多干货。

点击上方蓝字关注我,我们一起学编程
欢迎小伙伴们分享、转载、私信、赞赏

如果我是 DJ 你会爱我吗?你会爱我吗?你会爱我吗?
那 … 如果我是迪杰斯特拉,你会爱我吗?

哈哈哈,迪杰斯特拉(Dijkstra)是一种用于求解中的最短路径算法啦~
往期我们一起学习 A-start 算法,今天我们就来学习一下 Dijkstra 吧!

最短路径问题

最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成)中两结点之间的最短路径。最短路径问题是组合优化领域的经典问题之一,它广泛应用于计算机科学、交通工程、通信工程、系统工程、运筹学、信息论、控制理论等众多领域。

Dijkstra 算法

Dijkstra 算法适用于边权为正(边权为负会陷入死循环)的情况,该算法同时适用于有向图无向图。在下面的讲解中,我们考虑单源最短路径(Single-Source Shortest Paths,SSSP),即从单个源点出发,到所有结点的最短路。

基本思想:

图中所有结点分为已标号未标号两类。遍历所有未标号的结点,选择距离起始点 s 路径最短的一个节点 x ,并对 x 进行标号,再从 x 出发,遍历其所有相邻点,更新其相邻点到起点的最短距离;重复上述操作,直至遍历完所有结点。

伪代码:

清除所有点的标号
设 dist[0] = 0 ,其他结点 dist[i] = INF    // INF 为无穷大
循环 n 次 {
   
    在所有未标号的结点中,选出 dist 值最小的结点 x 
    标记结点 x
    对于从 x 出发的所有边 (x, y) ,更新 dist[y] = min{
   dist[y], dist[x] + w(x,y)}
}

动图演示:

C++ 参考代码:

根据上面的伪代码,我们很容易写出下面的程序。假设起点是结点 0 ,它到结点 i 的路径长度为 d[i] 。未标号结点的 visited[i] = false ,已标号结点的 visited[i] = true 。为了简单起见,用 w[x][y] == INF 表示边 (x,y) 不存在。

#define INF = INT_MAX

vector<bool> visited(n, false);
vector<int> dist(n, INF);

dist[0] = 0;

for (int i = 0; i < n; ++i) {
     
    int x;
    int m = INF;  
    
    /* 在未标记结点中寻找d值最小的结点 */
    for (int j = 0; j < n; ++j) {
   
        if (!visited[j] && dist[j] <= m) {
   
            m = dist
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值