Bellman-Ford算法与差分约束系统-Read.PPTVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Bellman-Ford算法 与差分约束系统 南开大学ACM协会 单源最短路径问题 单源最短路径=Single Source Shortest Path,即在有向图(或无向图)中求解给定点到其他点之间的最短距离 我们已知的方法是…… Dijkstra算法 暑期集训的时候已经对该算法做过介绍,这里不再重复 Dijkstra算法的局限性 如果边权为负值,Dijkstra算法还正确吗? 求解右图A 至其他点的最短距离 算法步骤: 1)标记点A 2)Dist[C]=2最小,标记点C 3)Dist[B]=3最小,标记点B 结束 但是ShortestDist[C]=1 Dijkstra算法的局限性 下图中,A至F的最短路径长度是多少? Dijkstra算法的局限性 如果利用Dijkstra算法求解,结果为…… 标记点A,Dist[B]=-1,标记点B Dist[C]=0,标记点C Dist[D]=-1,标记点D Dist[E]=-2,标记点E Dist[F]=-1,标记点F 所求得的距离 并不是最短的 错误结果的原因 Dijkstra的缺陷就在于它不能处理负权回路:Dijkstra对于标记过的点就不再进行更新了,所以即使有负权导致最短距离的改变也不会重新计算已经计算过的结果 我们需要新的算法——Bellman-Ford Bellman-Ford算法思想 Bellman-Ford算法基于动态规划,反复用已有的边来更新最短距离 Bellman-Ford算法的核心思想——松弛 Dist[u]和Dist[v]应当满足一个关系,即 Dist[v]=Dist[u]+w[u,v] 反复的利用上式对Dist数组进行松弛,如果没有负权回路的话,应当会在有限次松弛之后结束。那么上限是多少次呢? Bellman-Ford算法思想 考虑对每条边进行1次松弛的时候,得到的实际上是至多经过0个点的最短路径,对每条边进行两次松弛的时候得到的是至多经过1个点的最短路径,…… 如果没有负权回路,那么任意两点间的最短路径至多经过n-2个点,因此经过n-1次松弛操作后应当可以得到最短路径 如果有负权回路,那么第n次松弛操作仍然会成功,这时,最短路径为-∞ Bellman-Ford算法流程 所有点i赋初值Dist[i]= +∞ ,出发点为s,Dist[s]=0 for k=1 to n-1 for 每条边(u,v) 如果d[u]!= +∞ 且d[v]d[u]+w[u,v] 则d[v]=d[u]+w[u,v] for 每条边(u,v) 如果d[u]!= +∞ 且d[v]d[u]+w[u,v] 则存在负权回路 时间复杂度 算法复杂度为O(VE) 其中V=顶点数,E=边数 我们知道Dijkstra的算法复杂度是O(V^2),经过优化的Dijkstra算法可以达到O((V+E)logE) 所以Bellman-Ford算法并不比它快,但实际上Bellman-Ford算法也是可以优化的 Bellman-Ford算法的优化 在没有负权回路的时候,至多进行n-1次松弛操作会得到解,但实际上可能不到n-1此松弛操作就得到最优解了 可以在每一轮松弛的时候判断是否松弛成功,如果所有的边都没有松弛的话,说明Bellman-Ford算法已经可以结束了 进一步的优化——SPFA算法 SPFA=Shortest Path Faster Algorithm 也即Bellman-Ford算法的队列优化,这里的队列可以用双向队列,也可以两个普通队列 初始时将源加入队列。每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。直到队列为空时算法结束。 SPFA算法的效率 时间复杂度一般认为是O(kE) 其中k是一个较大的常数,不好估计,但是可以看出SPFA算法效率应当是很高的 经验表明Dijkstra算法的堆优化要比SPFA快,但SPFA比普通的Dijkstra算法快。而SPFA算法可以处理负权的问题,而且比Dijkstra算法的堆优化的代码要容易实现,因此SPFA是一个很好的算法。 Exercise POJ 1511 Invitation Cards 可以用SPFA算法 POJ = 差分约束系统 X0=0 X0-X1=-1 X1-X2=-5 X2-X3=-3 求X1,X2,X3最小值 X1=1,X2=6,X3=9 求解差分不等式组有什么好的方法吗? 与Bellman-Ford算法对比 前面用到过Dist[v]=Dist[u]+w[u,v]在最短路径求解后应当总是成立的,可以转化为 Dist[u]-Dist[v]=-w[u,v] 这与前面的不等式约束Xi-Xj=-k很类似,因此可以做如下转化: 如果存在约束条件Xi-Xj=-k,则建立一条

文档评论(0)

jinchenl + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档