最短路径算法

一,动态规划:
设起点为st,终点为ed。
用dis(v)表示v到st的距离。
动态规划方程:dis(v)=$min_{(u,v)∈E}{dis(u)+d(u,v)}$
初值dis(st)=0。
伪代码:(带open标记,省略了追踪数组per)
dis(st)=0
open(st)=true;
for all v!=st
  dis(v)=∞
  open(v)=false
for 1:|V|-1//推进|V|-1次
  for V中所有open=true的节点u
    open(u)=false;//关闭
    for (u,v)∈E
      dis(v)=min{dis(v),dis(u)+d(u,v)};
      open(v)=true;//开启
时间复杂度O(n^3)
注:此算法即所谓的Bellman-Ford算法(但添加了open标记),对于含负边的图也有效,如果要检测负环只需在|V|-1次推进后再推进一次,如果本次推进中某个dis值减小,则存在负环。
二,Dijkstra算法:
若图中所有边权非负,则open=true的点中dis最小者只有刷别人的份,而自身永远不会再被别人刷,所以其dis值必已无可改进,所以此时Bellman算法可改进为dijkstra算法。
伪代码:(省略per)
dis(st)=0
open(st)=true
for all v!=st
   dis(v)=∞
   open(v)=false
while open(ed)!=false//终点未关闭
{
  找到V中open=true且dis最小者minv
  open(minv)=false;//关闭
  for minv所有邻接点v
  {
     dis(v)=min{dis(v),dis(minv)+d(minv,v)};
     open(v)=true;//开启
  }
}
注:由于open=false的点的dis值必已达终态,故只要open(ed)==false即可断定计算已完成。
时间复杂度O(|V|^2)。
三,dag(有向无环图)中的最短路径
1,对顶点拓扑排序。
2,对顶点拓扑序列进行一遍扫描,用每个顶点刷其所有后继。
两步时间复杂度均为O(E),故总时间复杂度O(E)。
注:此算法也适用于含负边的情况并且也可用于求dag中的最长路径(关键路径)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值