数据结构——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文档。上传文档
查看更多
用顶点表示活动的网络 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条弧。 在贝尔曼—福特算法中,构造一个最短路径长度的数组序列:dist1[]、dist2[]、…、distn-1[]。 其中,dist1[u]表示从源点v0直接到终点u的最短路径的长度,即dist1[u]=Arcs[v0][u]; 而dist2[u]表示从源点v0出发最多经过两条弧(一个中间顶点)到达终点u的最短路径的长度,…, distk[u]是从源点v0出发最多经过不构成带负长度回路的k条弧(k-1个中间顶点)到达终点u的最短路径的长度。算法的结果就是计算出distn-1[u]。 广度优先遍历的算法: 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[v] = 1; //顶点 v 作已访问标记 q.EnQueue (v); //顶点 v 进队列q while ( !q.IsEmpty ( ) ) { v = q.DeQueue ( ); //否则, 队头元素出队列 int w = GetFirstNeighbor (v); while ( w != -1 ) { //若邻接顶点 w 存在 if ( !visited[w] ) { //若该邻接顶点未访问过 visit( GetValue (w)); //访问顶点 w

您可能关注的文档

文档评论(0)

带头大哥 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档