网站大量收购独家精品文档,联系QQ:2885784924

第7章图报告.ppt

  1. 1、本文档共145页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章图报告

克鲁斯卡尔算法求解最小生成树的过程(3) 12 0 1 5 4 3 6 2 10 14 16 22 12 0 1 5 4 3 6 2 10 14 16 22 25 0 1 5 4 3 6 2 28 10 16 14 25 24 18 22 12 图G 1 2 3 8 6 7 9 5 4 取6号边(不能取5号边) 取8号边(不能取7号边) 如何解决出现回路的问题 克鲁斯卡尔算法求解最小生成树的过程 0 1 5 4 3 6 2 28 10 16 14 25 24 18 22 12 图G 0 1 5 4 3 6 2 1 2 3 8 6 7 9 5 4 0 1 5 6 2 4 3 如何解决出现回路的问题 克鲁斯卡尔算法求解最小生成树的过程(1) 0 1 5 4 3 6 2 28 10 16 14 25 24 18 22 12 图G 0 1 5 4 3 6 2 10 12 0 1 5 4 3 6 2 10 1 2 3 8 6 7 9 5 4 取1号边 取2号边 0 1 0 6 2 4 3 0 1 0 6 2 4 2 克鲁斯卡尔算法求解最小生成树的过程(2) 12 0 1 5 4 3 6 2 10 14 12 0 1 5 4 3 6 2 10 14 16 0 1 5 4 3 6 2 28 10 16 14 25 24 18 22 12 图G 1 2 3 8 6 7 9 5 4 取3号边 取4号边 0 1 0 1 2 4 2 0 1 0 1 1 4 1 克鲁斯卡尔算法求解最小生成树的过程(3) 12 0 1 5 4 3 6 2 10 14 16 22 12 0 1 5 4 3 6 2 10 14 16 22 25 0 1 5 4 3 6 2 28 10 16 14 25 24 18 22 12 图G 1 2 3 8 6 7 9 5 4 取6号边(不能取5号边) 取8号边(不能取7号边) 0 1 0 1 1 1 1 0 0 0 0 0 0 0   在实现克鲁斯卡尔算法Kruskal()时,用一个数组E存放图G中的所有边,要求它们是按权值递增排列的,为此先从图G的邻接矩阵中获取所有边集E,再采用直接插入排序法对边集E按权值递增排序。克鲁斯卡尔算法如下: #include Graph.cpp //包含图的基本运算算法 const int MAXE=100; //最大的边数 template typename T struct Edge //边数组元素类型 {  int u; //边的起始顶点   int v; //边的终止顶点   T w; //边的权值 }; template typename T void Kruskal(GraphClassT gobj) //输出最小生成树 {  int i,j,u1,v1,sn1,sn2,k;   int vset[MAXV]; //建立数组vset   EdgeT E[MAXE]; //建立存放所有边的数组E   k=0; //E数组的下标从0开始计   for (i=0;igobj.g.n;i++) //由图的邻接矩阵g产生的边集数组E for (j=0;jgobj.g.n;j++) //对于无向图仅考虑上三角部分的边   if (gobj.g.edges[i][j]!=0 gobj.g.edges[i][j]!=INF ij)   { E[k].u=i; E[k].v=j; E[k].w=gobj.g.edges[i][j]; k++;   }   SortEdge(E,gobj.g.e); //采用直接插入排序对E数组按权值递增排序   for (i=0;igobj.g.n;i++) vset[i]=i; //初始化辅助数组   k=1; //k表示当前构造生成树的第几条边,初值为1   j=0; //E中边的下标,初值为0   while (kgobj.g.n) //生成的边数小于n时循环   { u1=E[j].u; v1=E[j].v; //取一条边的头尾顶点 sn1=vset[u1]; sn2=vset[v1]; //分别得到两个顶点所属的集合编号 if (sn1!=sn2) //两顶点属于不同的集合,加入不会构成回路 {  cout边(u1,v1),权为E[j].wendl; //输出最小生成树的边   k++; //生成边数增1   for (i=0;igobj.g.n;i++) //两个集合统一编号 if (vset[i]==sn2) //集合编号为sn2的改为sn1   vset[i]=sn1; } j++; //扫描下一条边   } }   通过改进可

文档评论(0)

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

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

1亿VIP精品文档

相关文档