Dijkstra's algorithm (狄克斯特拉算法)

Dijkstra算法是一种解决不包含负边的有权图中单源最短路径问题的方法。使用优先级队列,从起点开始,不断更新最短路径并推进。伪代码和Python实现示例,以及相关问题的编程挑战。
摘要由CSDN通过智能技术生成

概要

狄克斯特拉算法是从一个顶点到其余各顶点的最短路径算法,用于不包含负边的有权图中的单源最短路径问题。
类似于BFS(宽度优先搜索)。

方法

  • 准备priority_queue(优先级队列),push起点和到其的最短距离的信息(起点为00, 其他顶点为∞)。因为使用了优先级队列,所以信息以最短距离顺序排序。
  • 重复以下的操作,直到优先级队列为空集。
    1. 提取优先级队列的先头元素(距离最短的元素)
    2. 如果所提取的元素中包含的距离信息大于所记录的最短距离,则该操作终止,并且操作返回到提取前导元素的操作。
    3. 扫描可以从那里移动的顶点,如果有可以更新最短距离的顶点,则更新该距离,然后将把走到该顶点的距离,顶点的信息push到优先队列。

复杂度为O(ElogV)。

伪代码

// V: 顶点集
// Q: 优先级队列 元素由(距离,目前到达顶点)构成
// d(v): 距起始顶点的最短路径的长度
// prev(v): 走最短路径时的前一个顶点

// 初始化
for (v <- V)
    d(v) <- (如果v=s代入0,其他代入∞)
    prev(v) <- (没有)
    Q(v) <- d(v)

// 计算
while ( Q不是空集 )
    从Q中取出Q(u)最小的顶点u
    if d(u) < 取出元素的距离
    for each ( 与顶点u存在相连接的边的顶点v(属于V) )
    alt <- d(u) + length
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值