主要内容04377.ppt

  1. 1、本文档共36页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
主要内容04377

图论 算法 2007/06/11 主要内容 最短路径 AOV网 拓扑排序 关键路径 作业: 第一题 判断有向图回路 问题分析:如果图中存在回路,则必包含一个子图为回路。即该子图中所有顶点入度不为0且至少有边指向另外的顶点。 算法: 步骤1:按邻接表方式存储图。遍历与每个节点关联的边并统计每个节点的入度。需要O(n+m)次的运算。 步骤2:删除所有入度为零的顶点及其相发出的边。并将被删除边所指向的顶点的入度减1。 重复步骤二 直到: case1: 所有顶点被删除(则没有回路) 或 case2: 还有顶顶点但没有入度为零的顶点可删除(则存在回路)。 算法复杂度分析: 由于步骤二中的删除边的操作运算复杂度为O(m),删除节点的操作为O(n) 判断节点入度是否为0需要O(n+m)次运算。其中O(n)次为初始入度为零的节点,O(m)次为删除边后导致的入度为零的节点。 于是整个算法复杂度为O(m+n)。 作业: 第二题 判断无向图是否有回路 如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=2。 算法: 第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一。 第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。 如果最后还有未删除顶点,则存在环,否则没有环。 算法分析: 由于有m条边,n个顶点。如果m>=n,则根据图论知识可直接判断存在环路。 (证明:如果没有环路,则该图必然是k棵树 k>=1。根据树的性质,边的数目m = n-k。k>=1,所以:m<n) 如果m<n 则按照上面的算法每删除一个度为0的顶点操作一次(最多n次),或每删除一个度为1的顶点(同时删一条边)操作一次(最多m次)。这两种操作的总数不会超过m+n。由于m<n,所以算法复杂度为O(n) 作业中不少同学还给出了其它解决方法。 关于最小支生成树的prim算法 从一个顶点出发。 总是先拿当前所能看到的最小权重边相连的顶点进来。 重新审视周边的世界。并重复上一步。 带权图的最短路径 如果图中从一个顶点可以到达另一个顶点,则称这两个顶点间存在一条路径。从一个顶点到另一个顶点间可能存在多条路径,而每条路径上经过的边数并不一定相同。 如果图是一个带权图,则路径长度为路径上各边的权值的总和,两个顶点间路径长度最短的那条路径称为两个顶点间的最短路径,其路径长度称为最短路径长度。 Dijkstra算法 Dijkstra算法求解从顶点v0出发到其它各顶点的最短路径。 该算法按路径长度递增的次序产生最短路径。 该算法假设所有边的权都大于等于零。 问题分析: 基本思想 设置一个集合U,存放已求出最短路径的顶点,V-U是尚未确定最短路径的顶点集合。 每个顶点对应一个距离值,集合U中顶点的距离值是从顶点v0到该顶点的最短路径长度; 集合V-U中顶点的距离值是从顶点v0到该顶点的只包括集合U中顶点为中间顶点的最短路径长度。 初始状态: 集合U中只有顶点v0,顶点v0对应的距离值为0,集合V-U中顶点vi的距离值为边(v0, vi) (i=1,2,…,n-1)的权,如果v0和vi间无边直接相连,则vi的距离值为∞(实际程序中可以用一个足够大的数代替)。 处理步骤: (1)在集合V-U中选择距离值最小的顶点vmin加入集合U; (2)对集合V-U中各顶点的距离值进行修正:如果加入顶点vmin为中间顶点后,使v0到vi的距离值比原来的距离值更小,则修改vi的距离值。 (3)重复(1)(2)操作,直到从v0出发可以到达的所有顶点都在集合U中为止。 存储结构 到V0距离值的修正方法 如果加入顶点vmin为中间顶点后dist[i].length>dist[min].length+G.arcs[min][i], 则将顶点vi的距离值改为:dist[min].length+G.arcs[min][i] 并修改路径上vi的前趋顶点: dist[i].prevex=min。 例子 初始状态 ①.初始时,集合U中只有顶点v0。 结果dist[n]为{{0, 0}, {50, 0}, {10, 0}, {MAX, -1}, {45, 0}, {MAX, -1} } ②.在集合V-U中找出距离值最小的顶点v2,将顶点v2加入集合U中。 结果dist[n]为{{0, 0}, {50, 0}, {10, 0}, {MAX, -1}, {45, 0}, {MAX, -1} } ③.按min=2调整集合V-U中顶点的距离值。 因为dist[1].legth=50,dist[2].length+graph.arcs[2][1

文档评论(0)

jgx3536 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档