最短路最长路整理

发现很多东西不记下来过一段时间就想不明白了,先整理一部分,嗯不对的地方请路过的同学指正~

首先,最短路径相关算法通常依赖一个重要性质,即最短路径的子路径也是最短路。证明如下:


单源最短路:

1、Bellman-Fold算法 (将权值变为相反数,可以求最长路)

数组dis[i]]记录从源点s到顶点i的路径长度,初始化数组dis[i]为正无穷, dis[s]为0;

以下操作循环执行至多n-1次,n为顶点数:

这是因为最短路从1到n,最多经过n-1条边,而最上边每一层for循环,实际上是求从源点出发,只经过k条边最短路是多少,k最多n-1

对于每一条边e(u, v),如果dis[u] + w(u, v) < dis[v],则另dis[v] = dis[u]+w(u, v)。w(u, v)为边e(u,v)的权值;

若上述操作没有对Distant进行更新,说明最短路径已经查找完毕,或者部分点不可达,跳出循环(用flag标记优化)。否则执行下次循环;

为了检测图中是否存在负环路,即权值之和小于0的环路。对于每一条边e(u, v),如果存在dis[u] + w(u, v) < dis[v]的边,则图中存在负环路,即是说改图无法求出单源最短路径。否则数组dis[n]中记录的就是源点s到各顶点的最短路径长度。

复杂度为O(VE),最短路可以处理负环。


2、DAG(有向无环图) Shortest Path (可以求最长路)

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值