新数据结构——C++实现 教学课件 缪淮扣 顾训穰 沈俊 数据结构 第七章.pptVIP

新数据结构——C++实现 教学课件 缪淮扣 顾训穰 沈俊 数据结构 第七章.ppt

  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文档。上传文档
查看更多
用顶点表示活动的网络 迪杰斯特拉算法的实现: void Graph :: ShortestPath ( int n, int v ){ float min ; int u ; dist = new float[n]; s = new int[n]; path = new int[n]; for ( int i = 0; i n; i++) { dist[i] = Arcs[v][i]; //dist数组初始化 s[i] = 0; if ( i != v dist[i] MAXNUM) path[i] = v; else path[i] = -1; //path数组初始化 } S[v] = 1; //顶点v加入顶点集合s for ( i = 0; i n-1; i++ ) min = MAXNUM; u = v; for ( int j = 0; j n; j++ ) if ( !s[j] dist[j] min ) { u = j; min = dist[j]; } s[u] = 1; //将顶点u加入集合S for ( int w = 0; w n; w++ ) //修改dist和path if ( !s[w] dist[u] + Arcs[u][w] dist[w] ) { dist[w] = dist[u] + Arcs [u][w]; path[w] = u; } } } 弧上权值为任意值的单源点最短路径问题 在上一节中讨论了弧上权值为非负值的情况,接下来讨论更一般的情况,假设带权有向图G上弧的权值可能为负值。 例如,对于右图所示的带权有向图来说,利用上节给出的迪克斯特拉算法,不一定能得到正确的结果。 为了能够求解弧上带有负权值的单源最短路径问题,贝尔曼(BelLnam)和福特(Ford)提出了从源点逐次经过其它顶点,以缩短到达终点的最短路径长度的方法。该方法有一个限制条件,即要求图中不能有路径长度为负值的回路。 当图中没有路径长度为负值的回路时,有n个顶点的图中任意两个顶点之间如果存在最短路径,此路径最多有n-1条弧。 从指定的结点v开始进行广度优先搜索的算法步骤是: (1)访问结点v,并标记v已被访问,同时顶点v入队列; (2)当队列空时算法结束,否则继续步骤(3); (3)队头顶点出队列为v; (4)取顶点v的第一个邻接顶点w; (5)若顶点w不存在,转步骤(3);否则继续步骤(6) (6)若顶点w未被访问,则访问结点w,并标记w已被访问,同时顶点w入队列;否则继续步骤(7); (7)使w为顶点v的在原来w之后的下一个邻接顶点,转到步骤(5)。 广度优先遍历的算法: templateclass vertexType, class arcTypevoid Graph vertexType, arcType :: BFTraverse (void visit( vertexType v )) { int i, n = NumberOfVertexes() ;//取图的顶点个数 int * visited = new int [n]; //定义访问标记数组 visited for ( i = 0; i n; i++ ) visited [i] = 0; //访问标记数组 visited 初始化 for ( i = 0; i n; i++ ) //对图中的每一个顶点进行判断 if (!visited [i]) BFS (i, visited, visit); delete [ ] visited; //释放 visited } templateclass vertexType, class arcType void Graph vertexType, arcType :: BFS (const int v, int visited [ ], void visit( vertexType v )) { linkqueue int q; //定义队列q visit( GetValue (v)); //访问顶点 v visited[

您可能关注的文档

文档评论(0)

开心农场 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档