图论最短路杂项

一、各种名词:

(1)负权回路。

负权回路是指如果一个环的总长度为负数,那么就叫做负权回路

(2)重边。

重边是指a->b这条边会有两次及以上的输入(是同向的

(3)自环。

自环是指a->a的距离(即自己到自己)

二、最短路算法:        

(1)朴素Dijkstra算法:复杂度O(n^2)

Dijkstra只能用于求解正边权的最短路,其时间复杂度只与点数有关;一般用于求解稠密图的最短路

(2)堆优化Dijkstra算法:复杂度O(mlogn)

堆优化的Dijkstra,其时间复杂度既与点数有关,也与边数有关;一般用于求解稀疏图的最短路

(3)bellman-ford算法:复杂度O(nm)

bellman-ford用于求解有负权边的最短路问题,并且可以规定起点到终点之间最多经过几条边还可以用于判断负环(负权回路)

(4)spfa算法:复杂度O(nm)

spfa也是用于求解有负权边的最短路问题,其实质上是bellman-ford的队列优化版本,而且一般判断负环时用spfa而不是bellman-ford

(5)floyd算法:复杂度O(n^3)

floyd一般用于求解多源汇最短路问题,它既可以处理正权边,也可以处理负权边,但是不能处理负权回路

三、各种注意事项:

(1)对于重边,用邻接表存图的话不用做特殊处理,但是用邻接矩阵存图的话,就要取最小值

(2)对于自环,邻接表和邻接矩阵都不用做特殊处理,因为在取min的时候自环必然不会被选择

(3)对于floyd,自己到自己(自环)的距离要初始化为0,但是Dijkstra就不需要。因为在floyd的状态更新中,g[i][j]=min(g[i][j],g[i][k]+g[k][j]),三层循环遍历可能会出现i==k的情况;但是对于Dijkstra的更新,dist[j]=min(dist[j],dist[t]+w[i]),如果j==t,并且边权为正,那么肯定是dis[t]最小

(4)如果有负权回路,并不说明在求解最短路的过程中一定会死循环,只是说理论上最短路是负无穷,但是我们求出来的值只是一个确定的数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值