数据结构(第七章图).ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
7.4 图的连通性问题 (连通网)的最小生成树 ( for (i=1; iG.vexnum; ++i){}循环中内容) k = minimum(closedge); // 求出加入生成树的下一个顶点(k) printf(closedge[k].adjvex, G.vexs[k]); // 输出生成树上一条边(u,vk),其中G.vexs是顶点向量 closedge[k].lowcost = 0; // 把第k个顶点并入U集 for (j=0; jG.vexnum; ++j) // 新顶点并入U后,(可能)需要修改U中原顶点到V-U中其它顶点的最小边 //为第k个顶点到V-U中其它顶点的最小边 if (G.arcs[k][j].adj closedge[j].lowcost) closedge[j] = { G.vexs[k], G.arcs[k][j].adj }; 7.4 图的连通性问题 (连通网)的最小生成树 算法思想:设连通网N=(V,E),令最小生成树 初始状态为只有n个顶点而无边的非连通图T=(V,{?}),每个顶点自成一个连通分量 在E中选取代价最小的边,若该边依附的顶点落在T中两个不同的连通分量上,则将此边加入到T中;否则,舍去此边,选取下一条代价最小的边 依此类推,直至T中所有顶点都在同一连通分量上为止 例 1 6 5 4 3 2 6 5 1 3 5 6 6 4 2 5 1 6 5 4 3 2 1 2 3 4 5 1 6 5 4 3 2 克鲁斯卡尔(Kruskal)算法 a b c d e g f 19 5 14 18 27 16 8 21 3 a e 12 d c b g f 7 14 8 5 3 16 21 例如: 7 12 18 19 7.4 图的连通性问题 (连通网)的最小生成树 7.4 图的连通性问题 (连通网)的最小生成树 怎样实现Kruskal算法? 设计思路: ① 设每条边对应的结构类型为: 特点:将边归并——适于求稀疏网的最小生成树。 故采用邻接表作为图的存储表示。 vi vj weight ② 取堆顶元素,加入到对应最小生成树的新邻接表中(初始为空),从堆中删除它并重新排序堆,每次耗时log2(e); ③ 重复上一步,注意每次加入时要判断是否“多余”(即是否已被新表中的连通分量包含); ④ 直到堆空。 显然, Kruskal算法的时间效率=O(elog2e) 初态:按权值排序(以堆排序为佳,堆顶即为权值最小的边) Kruskal改写算法 void MiniSpanTree_Kruskal(ELGraph G, SqList MSTree) {// G.edge 中依权值从小到大存放有向网中各边,按克鲁斯卡尔 // 算法求得生成树的边存放在顺序表 MSTree 中 MFSet F; InitSet(F, G.vexnum);    // 将森林F初始化为n棵树的集合 InitList(MSTree, G.vexnum);   // 初始化生成树为空树 i=0; k=1; while( kG.vexnum ) {   e = G.edge[i];     // 取第 i 条权值最小的边 r1 = fix_mfset(F, LocateVex(e.vex1));  r2 = fix_mfset(F, LocateVex(e.vex2)); // 返回两个顶点所在树的树根  if (r1 != r2) {           // 选定生成树上第k条边   if (ListInsert(MSTree, k, e)) k++; // 插入生成树    mix_mfset(F, r1, r2);     // 将两棵树归并为一棵树   } // if    i++; // 继续考察下一条权值最小边 } // while DestroySet(F); } // MiniSpanTree_Kruskal typedef struct {  VertexType vex1;  VertexType vex2;  VRType weight; }EdgeType; typedef ElemType EdgeType; typedef struct {         // 有向网的定义  VertexType vexs[MAX_VERTEX_NUM];  // 顶点信息  EdgeType edge[MAX_EDGE_NUM];    // 边的信息  int vexnum,arcnum;        // 图中顶点的数目和边的数目 }ELGraph; 7.4 图

文档评论(0)

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

教师资格证持证人

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

领域认证该用户于2023年10月08日上传了教师资格证

1亿VIP精品文档

相关文档