MIT CS6.006 最短路径专题

本文详细介绍了单源最短路径问题,包括其变体和重要性质。讨论了Bellman-Ford算法,用于解决包含负权重边的最短路径问题,以及Dijkstra算法,适用于边权重非负的情况。通过松弛操作的概念,解释了这两种算法的工作原理,并给出了它们的时间复杂度和伪代码示例。
摘要由CSDN通过智能技术生成

单源最短路径
·找出一个带权有向图从起点到终点权重和最小的路径。
几个变体:
1.单目的地最短路径问题
2.单结点对最短路径问题
3.所有节点对最短路径问题

一个隐藏的重要性质:

两个节点之间的一条最短路径也包含着其它的最短路径,也就是说,最短路径的子路径也是最短路径

一般性,我们可以假定找到的最短路径中没有环路,即他们都是简单路径,由于图G=(V, E)中任意无环路径最多包含|V|个不同的节点,所以它至多包含|V-1|条边。因此最短路径至多是|V-1|

松弛操作(relaxation)
对一条边(u, v)的松弛过程为:
1.首先测试从起点s到v的最短路径能否改善
方法:将从节点s到节点u之间的最短路径距离加上节点u于v之间的边权重,并于当前s到v的最短路径估计进行比较,如前者更小就更新。

伪代码:

RELAX(u, v, w)
    if v.d>u.d+w(u, v)
       v.d = u.d + w(u, v)
       v.Π=u

解决单源最短路径的两种算法:
Bellman-Ford:解决一般情况下的单源最短路径(边权重可为负值),动态规划
Dijkstra:只能解决边权值为正的情况,贪心,时间复杂度较低。

Bellman-Ford:

给定带权重的有向图G=(V, E)和权重函数w, Bellman-Ford算法返回一个布尔值,表明是否存在一个从源节点可以到达的权重为负值的环路,如果该环路存在,算法告诉我们不存在解决方法,环路不存在,算法返回最短路径以及对应权重。
时间复杂度O(VE)
伪代码:

BELLMAN-FORD(G, w, s)
   INIIALIZE-SINGLE-SOURCE(G, s)
      for i = 1 to |G.V| - 1
          for each edge(u, v)∈G.E
              RELAX(u, v, w)
      for each edge(u, v)∈G.E
          if v.d>u.d+w(u, v)
             return FLASE
      return TRUE

给定原点是s,初始化时候除了原点s之外,其他的都是无穷大的。因为有5个顶点,所以需要松弛的次数为5-1次在这里插入图片描述

这里我们按照边<t,x>、<t,y>、<t,z>、<y,x>、<y,z>、<z,x>、<z,s>、<s,t>、<s,y>的顺序进行变得松弛操作。第一次按照上述边进行松弛操作之后(实际上只对<s,t>、<s,y>进行操作)的结果为
在这里插入图片描述
第二次按照给定边进行松弛操作之后:
在这里插入图片描述
第三次松弛操作之后:
在这里插入图片描述
最后一次松弛操作:
在这里插入图片描述

#include<iostream>
#include<vector>
#include<cmath>

using namespace std;
struct edge{
   
    int from;
    int to;
    double weight;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值