预推免面试-算法-最短路径问题

目录

Dijkstra

Floyd

Bellman-Ford

SPFA


Dijkstra

采用贪心策略的带权重的有向图上单源最短路径算法

要求所有边的权重为非负值

算法维护一个数组dist保存源点到各个顶点的最短距离

和一个保存已经找到了最短路径的顶点集合T

算法步骤:

  1. 初始化:源点到源点的dist设为0,源点到邻边的dist设为边权值,源点到其他点的dist设为正无穷,T初始只有源点s
  2. dist数组选择最小值对应的点u加入T中,并更新u的相邻点v到s的dist的值:比较dist(s,v)和dist(s,u)+dist(u,v)的值
  3. 重复操作直到所有的点被加入T中

如果最后得到的dist存在正无穷值,代表源点到该点不可达

所以可以用来判断两点是否可达

根据最小优先队列的实现,有不同的时间复杂度

Floyd

多源最短路径算法

维护dist(i,j)二维数组

算法步骤:

  1. 对于任意一条边,遍历其他的所有点,比较是否经过该点可以得到更短的路径

时间复杂度:O(n^3)

Bellman-Ford

允许负权边的出现

算法维护每个点的数组dist[u],其中dist[s]=0,其他的点为∞

算法步骤:

  1. 遍历所有的边,更新边的尾部端点的dist值,当dist[v]>dist[u]+w[u,v]时
  2. 重复步骤1共n-1次
  3. 判断是否有负权环路:dist[v]>dist[u]+w[u,v]即还满足一的条件但是没有更新的,返回False

SPFA

Bellman-Ford+队列优化

算法步骤:

  1. 源点s入队
  2. 取出队头,遍历出边,进行松弛,将松驰过且不在队列中的点加入队列(用于更新其他的点)
  3. 直到队列为空

判断负权环路:

某个点进入队列的次数超过N次则存在负环

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值