- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
复杂度 与Dijkstra算法的代码1类似,复杂度为O(V ^ 2),也可以用堆来维护mincost,类似Dijkstra算法的代码2,这样可以将复杂度改进到O(E * logV) Kruskal算法 算法思想:按照边的权值从小到大的顺序扫描一遍,如果不产生圈,就把当前这边加入到生成树中。 终点:如何判断是否会产生圈? 并查集 代码实现 复杂度 排序最耗时,复杂度为O(ElogE) 课后作业 POJ No.3723 自己实现可以得到最短路径的最短路算法 课后作业提示 POJ No.3723 花的钱最少,等价于省的钱最多 构建一个图,每条边的权值等于通过这个关系招募能省的钱的负数,然后计算最小生成树,这样得到的就是最多能省下的钱的负数 然后通过一个简单的加减法运算即可得到结果 “ ” “ ” 算法3 讲师:刘少凡 目录 图 最短路算法 最小生成树 图 图由顶点(vertex,node)和边(edge)组成。顶点集合是V,边的集合是E的图记做G=(V,E),连接两点u和v的边用e=(u,v)表示 边有指向性的图为有向图 边无指向性的图为无向图 图的表示方法 邻接矩阵与邻接表 选择哪一种方法? 邻接矩阵优点:便于查找两顶点是否相连,程序编写简单 缺点:浪费大量空间 邻接表优点:节省空间 缺点:查询两顶点是否相连需要遍历,程序编写较困难 视情况而定 目录 图 最短路算法 最小生成树 最短路问题 一般为给定两个顶点,以这两个顶点为起点和终点的路径中,求边的权值和最小的那条路径(或者只需要求最短距离)。 单源最短路径问题 固定一个起点,求它到其他所有点的最短路的问题。 算法1:Bellman-Ford算法 算法2:Dijkstra算法 Bellman-Ford算法 代码实现 示例 假设A为源点 初始d = {0, INF, INF, INF, INF, INF, INF} 第一轮遍历结束 d = { 0, 2, 5, INF, INF, INF, INF} 第二轮遍历结束 d = { 0, 2, 5, 7, 12, INF, INF} 第三轮遍历结束 d = { 0, 2, 5, 7, 12, 8, 17} 第四轮遍历结束 d = { 0, 2, 5, 7, 11, 8, 16} 注:真实算法计算情况会因边的遍历顺序不同而不同 复杂度 每轮更新至少都能确定到某一个点的最短路径,所以最多会更新V-1轮,每轮都会遍历E条边,所以复杂度为O(V * E) 另外,如果图中有负圈,第V轮更新依然会更新d的值,可以利用这个性质来检查图中是否有负圈 Dijkstra算法 算法思想:找到最短距离已经确定的顶点,从它出发更新相邻顶点的最短距离,从此后不再关心该最短距离已经确定的点(需要图中不存在负边) 如何寻找最短距离已经确定的顶点? 最开始时,只有源点的最短距离是确定的。在之后,尚未使用过的顶点中,距离d[i]最小的顶点就是最短距离已经确定的顶点 代码实现 复杂度 While循环每次会使用一个点作为v,直到所有点都用过,会循环V次 内层循环会循环V次 复杂度为 O(V * V) Bellman-Ford算法复杂度为O(V * E) 当V E时,可以选择dijkstra算法 但是一般情况下,边的数量会大于顶点的数量,那么dijkstra算法还有什么存在的必要呢? 代码实现2 代码实现2 复杂度 外层while循环里面执行的主体代码(最耗时)是上图所示的for循环,而每个for循环就是对于某个顶点出发的所有边都进行一次更新操作,while循环的目的是所有顶点进行一次for循环操作。for循环内的操作相当于被执行了E次,每次更新操作复杂度为O(logV),所以总复杂度为O(E * logV) Bellman-Ford算法复杂度为O(V * E) 第二份代码实现的dijkstra算法更快 那么第二份代码与第一份代码的区别是什么? 采用了堆(优先队列)的数据结构,优化了取出最小值和距离更新操作 优选数据结构很重要 总结 对于不存在负边的图,可以使用Dijkstra算法解决单源最短路径问题 对于不存在负圈的图,可以使用Bellman-Ford算法解决单源最短路径问题 对于存在负圈的图?不存在最短路径,因为每绕负圈一周都可以使路径减小 任意两点间的最短路问题 前面介绍的Bellman-Ford算法和Dijkstra算法都是解决的单源最短路径问题,那么如何求任意两点间的最短路径呢? 方法1:将每个点作为源点,分别用Bellman-Ford算法或Dijkstra算法进行计算,复杂度O(E * V^2)或O(E * V * logV) 方法2:Floyd-Warshall算法 Floyd-Warshall算法 算法思想:DP d[i][j]
您可能关注的文档
最近下载
- 幼儿教师口语 第2版 课件 19项目六任务2态势语训练.ppt
- 《空乘旅游英语视听说》课件——Check-in and Security Check.pdf VIP
- (高清版)ZT 0227-2010 地质岩心钻探规程.pdf VIP
- 医师培训考核合格证明_sample.pdf VIP
- 驾照考试科目一试题1000题(含标准答案) .pdf VIP
- 2025春新人教版初中九年级数学下册(全册)完整课件.ppt
- 急性缺血性卒中再灌注治疗指南2024解读.pptx
- 计算机维修工中级理论题库附答案(201-400题).docx VIP
- 计算机维修工中级理论题库附答案(1-200题).docx VIP
- 小学趣味数学校本教材.doc VIP
原创力文档


文档评论(0)