数据结构 (C语言版)课件:第7章_图.pptVIP

数据结构 (C语言版)课件:第7章_图.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文档。上传文档
查看更多
7.3 图的遍历 深度优先搜索的示例 7.4 图的连通性问题 本节所讨论的内容是图的遍历算法的具体应用。 7.4.1 无向图的连通分量与生成树 1 无向图的连通分量和生成树 对于无向图,对其进行遍历时: ◆ 若是连通图:仅需从图中任一顶点出发,就能访问图中的所有顶点; ◆ 若是非连通图:需从图中多个顶点出发。每次从一个新顶点出发所访问的顶点集序列恰好是各个连通分量的顶点集; 对于非连通图的遍历,需多次调用DFS或BFS。每一次调用后都得到此非连通图一个连通分量。调用DFS或BFS的次数就是连通分量的个数 普里姆(Prim)算法 基本思想: 从连通网络 N = { V, E }中的某一顶点 u0 出发,选择与它关联的具有最小权值的边(u0, v),将其顶点加入到生成树的顶点集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u, v),把该边加入到生成树的边集TE中,把它的顶点加入到集合U中。如此重复执行,直到网络中的所有顶点都加入到生成树顶点集合U中为止。 采用邻接表作为存储结构: 设置一个辅助数组closedge[]: lowcost域 存放生成树顶点集合内顶点到生成树外各顶点的各边上的当前最小权值; adjvex域 记录生成树顶点集合外各顶点距离集合内哪个顶点最近(即权值最小)。 若选择从顶点0出发,即u0 = 0,则辅助数组的两个域的初始状态为: 然后反复做以下工作: 在 closedge [i]中选择 adjvex ? 0 lowcost最小的边 i 用 k 标记它。则选中的权值最小的边为 (closedge[k], G.vexs[k]),相应的权值为 closedge[k].lowcost。 将 closedge[k].adjvex 改为 0, 表示它已加入生成树顶点集合。将边 (closedge[k], G.vexs[k])加入生成树的边集合。 克鲁斯卡尔(Kruskal)算法 1 算法思想 设G=(V, E)是具有n个顶点的连通网,T=(U, TE)是其最小生成树。初值:U=V,TE={} 。 对G中的边按权值大小从小到大依次选取。 ⑴ 选取权值最小的边(vi,vj),若边(vi,vj)加入到TE后形成回路,则舍弃该边(边(vi,vj) ;否则,将该边并入到TE中,即TE=TE∪{(vi,vj)} 。 ⑵ 重复⑴ ,直到TE中包含有n-1条边为止。 如图所提示。 克鲁斯卡尔算法构造最小生成树的过程 2 算法实现说明 Kruskal算法实现的关键是:当一条边加入到TE的集合后,如何判断是否构成回路? 简单的解决方法是:定义一个一维数组Vset[n] ,存放图T中每个顶点所在的连通分量的编号。 ◆ 初值:Vset[i]=i,表示每个顶点各自组成一个连通分量,连通分量的编号简单地使用顶点在图中的位置(编号)。 ◆ 当往T中增加一条边(vi,vj) 时,先检查Vset[i]和Vset[j]值: ☆ 若Vset[i]=Vset[j]:表明vi和vj处在同一个连通分量中,加入此边会形成回路; ☆ 若Vset[i]≠Vset[j],则加入此边不会形成回路,将此边加入到生成树的边集中。 ◆ 加入一条新边后,将两个不同的连通分量合并:将一个连通分量的编号换成另一个连通分量的编号。 ☆ 若Vset[i]≠Vset[j],则加入此边不会形成回路,将此边加入到生成树的边集中。 ◆ 加入一条新边后,将两个不同的连通分量合并:将一个连通分量的编号换成另一个连通分量的编号。 算法实现 MSTEdge *Kruskal_MST(ELGraph *G) /* 用Kruskal算法构造图G的最小生成树 */ { MSTEdge TE[] ; int j, k, v, s1, s2, Vset[] ; WeightType w ; Vset=(int *)malloc(G-vexnum*sizeof(int)) ; 对上图,深度优先搜索遍历的顺序(之一)为: v1 →v2→v4→ v8→ v5→v6→v3→v7。 图7-10 深度优先搜索 深度优先搜索算法: int visited[MAX_VERTEX_NUM]; void DFS(ALGraph G, int v) { ArcNode *p; printf(%c,G.vertices[v].data); visited[v]=1; p=G.vertices[v].firstarc; while (p) { if (!vi

文档评论(0)

学习让人进步 + 关注
实名认证
文档贡献者

活到老,学到老!知识无价!

1亿VIP精品文档

相关文档