浅谈bellmanford[精选].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文档。上传文档
查看更多
浅谈bellmanford[精选]

Bellman-Ford算法与SPFA算法 单源最短路径问题 单源最短路径=Single Source Shortest Path,即在有向图(或无向图)中求解给定点到其他点之间的最短距离 我们已知的方法是……XXX讲的Dijkstra算法 但是………… Dijkstra算法的局限性 如果边权为负值,Dijkstra算法还正确吗? 求解右图A 至其他点的最短距离 算法步骤: 1)标记点A 2)D[A,C]=2最小,标记点C 3)D[A,B]=3最小,标记点B 结束 但是 实际上A到C点的 最短距离为1(A到B到C) Dijkstra算法的局限性 下图中,A至F的最短路径长度是多少? Dijkstra算法的局限性 由于B,C,D,E构成了负权回路,所以A到F的最小距离为负无穷…… 但是………… Dijkstra算法的局限性 如果利用Dijkstra算法求解,结果为…… 标记点A,D[B]=-1,标记点B D[C]=0,标记点C D[D]=-1,标记点D D[E]=-2,标记点E D[F]=-1,标记点F 所求得的距离 并不是最短的 错误结果的原因 Dijkstra的缺陷就在于它不能处理负权回路:Dijkstra对于标记过的点就不再进行更新了,所以即使有负权导致最短距离的改变也不会重新计算已经计算过的结果 我们需要新的算法——Bellman-Ford Bellman-Ford算法思想 Bellman-Ford算法基于动态规划,反复用已有的边来更新最短距离 Bellman-Ford算法的核心思想——松弛 那么何为松弛操作呢…… 其实我们之前提到过…… 松弛操作 若F[u]和F[v]应当满足F[v]=F[u]+w[u,v] 则F[V] 的值更新为F[U]+w[u,v] 反复的利用上式对F数组进行松弛,如果没有负权回路的话,应当会在有限次松弛之后结束。 那么这个次数应该是多少? 简单点说…… 考虑对每条边进行1次松弛的时候,得到的实际上是至多经过0个点的最短路径,对每条边进行两次松弛的时候得到的是至多经过1个点的最短路径,…… 如果没有负权回路,那么任意两点间的最短路径至多经过n-2个点,因此经过n-1次松弛操作后应当可以得到最短路径 如果有负权回路,那么第n次松弛操作仍然会成功,这时,最短路径为-∞ Bellman-Ford算法流程   1,.初始化:将除源点外的所有顶点的最短距离估计值 f[v] ←+∞, f[s] ←0;   2.迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离;(运行|v|-1次)   3.检验负权回路:判断边集E中的每一条边的两个端点是否收敛。如果存在未收敛的顶点,则算法返回false,表明问题无解;否则算法返回true,并且从源点可达的顶点v的最短距离保存在 d[v]中。 Bellman-Ford算法最简单的形式…… For i:= 1 to n do D[i]:= maxlongint; D[s]:=0 //出发点为s for k:=1 to n-1 do for j:= 1 to E do if d[e[j,1]]d[e[j,2]+w[j] then d[e[j,1]]=d[e[j,2]]+w[j]; Flag:=true; for k:= 1 to E do if d[e[k,1]]d[e[k,2]]+w[k] then flag:=false; If flag then write(d[n]) else write(‘error’); (E[i,1],E[i,2]表示第i条边两个端点,w[i]表示第i条边得权值。) 时间复杂度 算法复杂度为O(VE) 其中V=顶点数,E=边数 我们知道Dijkstra的算法复杂度是O(V^2), 所以Bellman-Ford算法并不比它快,但实际上Bellman-Ford算法也是可以优化的 Bellman-ford算法优化 Bellman-ford算法有一个小优化:每次松弛先设一个变量flag,初值为FALSE,若有边更新则赋值为TRUE,最终如果还是FALSE则直接成功退出。Bellman-ford算法浪费了许多时间做无比要的松弛 于是出现了用队列进行了优化的SPFA算法 进一步的优化——SPFA算法 SPFA=Shortest Path Faster Algorithm 即Bellman-Ford算法的队列优化  实现方法: 1、建立一个队列,初始时队列里只有起始点,在建立一个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极大值,该点到他本身的路径赋为0)。 2、执行松弛操作,用队列里有的点去刷新起始点到所有点的最短路,如果刷

文档评论(0)

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

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

1亿VIP精品文档

相关文档