数据结构--第七章 图.ppt

  1. 1、本文档共115页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
访问时应保证:如果Vi和Vk为当前端结点,且Vi在Vk之前被访问,则Vi的所有未被访问的邻接点应在Vk的所有未被访问的邻接点之前访问。重复(3),直到所有端结点均没有未被访问的邻接点为止。 若此时还有顶点未被访问,则选一个未被访问的顶点作为起始点,重复上述过程,直至所有顶点均被访问过为止。 广度优先搜索过程示例见p169的图7.16所示。其中箭头代表搜索方向,箭头旁边的数字代表搜索顺序,A为起始顶点。 A D G B E H C F I 1 4 6 5 7 8 2 3 访问序列为:A、B、E、D、C、G、F、H、I。 广度优先搜索连通子图的算法如下: void BreadthFirstSearch(Graph g, int v0) /*广度优先搜索图g中v0所在的连通子图*/ { visit(v0); visited[v0]=True; InitQueue(Q); /*初始化空队*/ EnterQueue(Q,v0);/* v0进队*/ while ( ! Empty(Q)) { DeleteQueue(Q, v); /*队头元素出队*/ w=FirstAdj(g,v); /*求v的第一个邻接点*/ while (w!=-1 ) { if (!visited(w)) { visit(w); visited[w]=True; EnterQueue(Q, w); } w=NextAdj(g, v, w); /*求v相对于w的下一个邻接点*/ } } } 7.4 图的连通性问题 无向图的连通分量 在对图遍历时,对于连通图,无论是广度优先搜索还是深度优先搜索,仅需要调用一次搜索过程,即从任一个顶点出发,便可以遍历图中的各个顶点。对于非连通图,则需要多次调用搜索过程,而每次调用得到的顶点访问序列恰为各连通分量中的顶点集。调用搜索过程的次数就是该图连通分量的个数。 例如:p171的图7.17(a)是一个非连通图,按照它的邻接表进行深度优先搜索遍历,三次调用深度优先搜索(DepthFirstSearch)过程得到的访问顶点序列为: 1,2,4,3,9 5,6,7 8,10 因此有三个连通分量。如p171的图7.17(c). 最小生成树 在一个连通网的所有生成树中,各边的代价之和最小的那棵生成树称为该连通网的最小代价生成树(Minimum Cost Spanning Tree),简称为最小生成树。 最小生成树的重要性质如下: 设N=(V,{E}) 是一连通网,U 是顶点集V的一个非空子集。若(u , v)是一条具有最小权值的边,其中u∈U,v∈V-U,则存在一棵包含边(u , v)的最小生成树。 用反证法来证明这个最小生成树(MST)的性质: 假设不存在这样一棵包含边(u , v)的最小生成树。任取一棵最小生成树T,将(u , v)加入T中。根据树的性质,此时T中必形成一个包含(u , v)的回路,且回路中必有一条边(u’ , v’)的权值大于或等于(u , v)的权值。删除(u , v),则得到一棵代价小于等于T的生成树T’,且T’为一棵包含边(u , v)的最小生成树。这与假设矛盾。 一个连通网的最小生成树算法: 普里姆算法 假设N=(V,{E})是连通网,TE为最小生成树中边的集合。 (1)初始U={u0}(u0∈V),TE=φ; (2)在所有u∈U, v∈V-U的边中选一条代价最小的边(u0,v0)并入集合TE,同时将v0并入U; (3)重复(2),直到U=V为止。 此时,TE中必含有n-1条边,则T=(V,{TE})为N的最小生成树。 普里姆算法是逐步增加U中的顶点,可称为“加点法” 注意:选择最小边时,可能有多条同样权值的边可供选择,此时任选其一。 为了实现这个算法需设一个辅助数组closedge[ ],以记录从U道V-U具有最小代价的边。对每个顶点v∈V-U,在辅助数组中存在一个分量closedge[v],它包括两个域vex和lowcost,其中lowcost存储该边上的权,显然有 closedge[v].lowcoast=Min({cost(u,v) | u∈U}) 普里姆算法可描述为: struct { VertexData adjvex; int lowcost; } closedge[MAX_VERTEX_NUM]; /* 求最小生成树时的辅助数组*/ MiniSpanTree_Prim(AdjMatrix gn, VertexData u) /*从顶点u出发,按普里姆算法构造连通网gn 的最小生成树,并输出生成树的每条边*/

文档评论(0)

2232文档 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档