版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Bellman-Ford算法与差分约束系统,单源最短路径问题,单源最短路径=Single Source Shortest Path,即在有向图(或无向图)中求解给定点到其他点之间的最短距离 我们已知的方法是 Dijkstra算法 暑期集训的时候已经对该算法做过介绍,这里不再重复,Dijkstra算法的局限性,如果边权为负值,Dijkstra算法还正确吗? 求解右图A 至其他点的最短距离 算法步骤:1)标记点A2)DistC=2最小,标记点C3)DistB=3最小,标记点B结束 但是ShortestDistC=1,Dijkstra算法的局限性,下图中,A至F的最短路径长度是多少?,1,1,-1,
2、-1,-1,-1,-,Dijkstra算法的局限性,如果利用Dijkstra算法求解,结果为 标记点A,DistB=-1,标记点B DistC=0,标记点C DistD=-1,标记点D DistE=-2,标记点E DistF=-1,标记点F 所求得的距离并不是最短的,错误结果的原因,Dijkstra的缺陷就在于它不能处理负权回路:Dijkstra对于标记过的点就不再进行更新了,所以即使有负权导致最短距离的改变也不会重新计算已经计算过的结果 我们需要新的算法Bellman-Ford,Bellman-Ford算法思想,Bellman-Ford算法基于动态规划,反复用已有的边来更新最短距离 Bell
3、man-Ford算法的核心思想松弛 Distu和Distv应当满足一个关系,即 Distv=Distu+wu,v 反复的利用上式对Dist数组进行松弛,如果没有负权回路的话,应当会在有限次松弛之后结束。那么上限是多少次呢?,Bellman-Ford算法思想,考虑对每条边进行1次松弛的时候,得到的实际上是至多经过0个点的最短路径,对每条边进行两次松弛的时候得到的是至多经过1个点的最短路径, 如果没有负权回路,那么任意两点间的最短路径至多经过n-2个点,因此经过n-1次松弛操作后应当可以得到最短路径 如果有负权回路,那么第n次松弛操作仍然会成功,这时,最短路径为-,Bellman-Ford算法流程
4、,所有点i赋初值Disti= + ,出发点为s,Dists=0 for k=1 to n-1for 每条边(u,v) 如果du!= + 且dvdu+wu,v则dv=du+wu,v for 每条边(u,v)如果du!= + 且dvdu+wu,v则存在负权回路,时间复杂度,算法复杂度为O(VE)其中V=顶点数,E=边数 我们知道Dijkstra的算法复杂度是O(V2),经过优化的Dijkstra算法可以达到O(V+E)logE) 所以Bellman-Ford算法并不比它快,但实际上Bellman-Ford算法也是可以优化的,Bellman-Ford算法的优化,在没有负权回路的时候,至多进行n-1次
5、松弛操作会得到解,但实际上可能不到n-1此松弛操作就得到最优解了 可以在每一轮松弛的时候判断是否松弛成功,如果所有的边都没有松弛的话,说明Bellman-Ford算法已经可以结束了,进一步的优化SPFA算法,SPFA=Shortest Path Faster Algorithm 也即Bellman-Ford算法的队列优化,这里的队列可以用双向队列,也可以两个普通队列 初始时将源加入队列。每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。直到队列为空时算法结束。,SPFA算法的效率,时间复杂度一般认为是O(kE) 其中k是一个较大的常数,不好估计,但是可
6、以看出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算法对比,前面用到过Distv=-wu,v 这与前面
7、的不等式约束Xi-Xj=-k很类似,因此可以做如下转化: 如果存在约束条件Xi-Xj=-k,则建立一条边由i指向j,权值为k,这样就把差分约束系统问题转化为最短路径问题了,然后利用Bellman-Ford算法求解,与Bellman-Ford算法对比,差分不等式组可能是没有解的,这实际上就对应了Bellman-Ford求解存在负权回路 根据具体情况,有的时候要求的是单源最长路径,道理是一样的,POJ 1201 Intervals,输入数据 5 3 7 3 8 10 3 6 8 1 1 3 1 10 11 1,含义 有5组约束条件(至多50000) 区间3,7上至少有3个点 区间8,10上至少有3
8、个点 区间6,8上至少有1个点 区间1,3上至少有1个点 区间10,11上至少有1个点,在区间0,50000上面有一些整点,问题的转化,问题要求输出至少有多少个整点 如果用数组Si表示在0,i这个区间上面有多少个点,则题中输入数据ai,bi,ci可以表示为Sbi-Sai-1=ci 除此之外还有隐含条件:Si+1-Si=0Si+1-Si=1 可以建立一个图,利用Bellman-Ford算法求解,POJ 1275 Cashier Employment,给定一天每一小时最少需要的出纳员数量:R0,R1,R2,R23其中R0表示从0点到1点需要的出纳员数量 有N个人申请工作,其中每个人都是从一个特定的时间开始连续工作8小时,从时间i开始工作的人数为ti 求至少需要雇佣多少个人,问题的转化,Si代表0-i时刻录用的出纳员总数 定义S-1=0(实际处理的时候可以把下标整体+1) Si-Si-1=0 Si-1-Si=-ti也即Si=sum(实际上是=) Si-Sj=Ri ij 且 i=j+8
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 内蒙古师范大学《电机学》2025-2026学年期末试卷
- 沈阳师范大学《民俗学》2025-2026学年期末试卷
- 沈阳药科大学《土地经济学》2025-2026学年期末试卷
- 上海震旦职业学院《风险管理与金融机构》2025-2026学年期末试卷
- 齐齐哈尔立德健康职业学院《中药鉴定学》2025-2026学年期末试卷
- 上海海事职业技术学院《劳动与社会保障法》2025-2026学年期末试卷
- 沈阳化工大学《畜牧微生物学》2025-2026学年期末试卷
- 上海浦东职业技术学院《当代教育心理学》2025-2026学年期末试卷
- 上海济光职业技术学院《流通概论》2025-2026学年期末试卷
- 兴安职业技术大学《服务贸易》2025-2026学年期末试卷
- 蔬果采购员管理制度
- 2026年青海省海南藏族自治州单招职业适应性测试题库附参考答案详解(模拟题)
- 广告制作公司奖惩制度
- 2026年及未来5年市场数据辽宁省环保行业市场行情动态分析及发展前景趋势预测报告
- 基金会会计监督制度
- 幼儿园课件《认识我们的身体》课件
- 违反无菌技术操作
- 骨髓腔穿刺科普
- 长螺旋钻孔灌注桩基础施工组织设计方案
- 管道酸洗、钝化施工方案
- 苏州市2024年江苏苏州工业园区房地产交易管理中心辅助人员招聘4人笔试历年参考题库典型考点附带答案详解(3卷合一)
评论
0/150
提交评论