且包含原图中的所有n个结点,并且有保持图连通的最少的边.docVIP

且包含原图中的所有n个结点,并且有保持图连通的最少的边.doc

  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文档。上传文档
查看更多
且包含原图中的所有n个结点,并且有保持图连通的最少的边.doc

最小生成树 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。 两算法都能从连通图找出最小生成树。区别在于Prim算法是挨个找,而Kruskal是先排序再找。 求MST(most small tree)的一般算法可描述为:针对图G,从空树T开始,往集合T中逐条选择并加入n-1条安全边(u,v),最终生成一棵含n-1条边的MST。 当一条边(u,v)加入T时,必须保证T∪{(u,v)}仍是MST的子集,我们将这样的边称为T的安全边。 Prim算法简述 Prim算法实现的是找出一个有权重连通图中的最小生成树,即:具有最小权重且连接到所有结点的树。(强调的是树,树是没有回路的)。 Prim算法是这样来做的: 首先以一个结点作为最小生成树的初始结点,然后以迭代的方式找出与最小生成树中各结点权重最小边,并加入到最小生成树中。加入之后如果产生回路则跳过这条边,选择下一个结点。当所有结点都加入到最小生成树中之后,就找出了连通图中的最小生成树。 1.先选取一个点作起始点,然后选择它邻近的权值最小的点(如果有多个与其相连的相同最小权值的点,随便选取一个)。如1作为起点。 visited[1]=1; pos=1; //用low[]数组不断刷新最小权值,low[i](0i=点数)的值为:i点到邻近点(未被标记)的最小距离。 low[1]=0; //起始点i到邻近点的最小距离为0 low[2]=map[pos][2]=4; low[3]=map[pos][3]=2; low[4]=map[pos][4]=3; low[5]=map[pos][5]=MaxInt; //无法直达 low[6]=map[pos][6]=MaxInt; 2.再在伸延的点找与它邻近的两者权值最小的点。 //low[]以3作当前位置进行更新 visited[3]=1; pos=3; low[1]=0; //已标记,不更新 low[2]=map[1][2]=4; //比5小,不更新 low[3]=2; //已标记,不更新 low[4]=map[1][4]=3; //比1大,更新后为:low[4]=map[3][4]=1; low[5]=map[1][5]=MaxInt;//无法直达,不更新 low[6]=map[1][6]=MaxInt;//比2大,更新后为:low[6]=map[3][6]=2; ?3.如此类推... int prim() { int i,j,pos,min,result=0; memset(visited,0,sizeof(visited)); visited[1]=1; pos=1; for(i=1;i=n;i++) if(i!=pos) low[i]=map[pos][i];// //进行 n-1次循环,将其中的 n-1个顶点并入 1中 for(i=1;in;i++) { min=MaxInt; for(j=1;j=n;j++) //找出距离当前点最近的边 if(!visited[j]minlow[j]) { min=low[j];pos=j; } result+=min; //计算最短路径总和 visited[pos]=1; //对于新加进来的顶点,将 map[pos][j]与low[j]进行比较,然后更新 low,low[]是专门对 1 号顶点设置的数组 for(j=1;j=n;j++) //再在伸延的点找与它邻近的两者权值最小的点 if(!visited[j]low[j]map[pos][j]) low[j]=map[pos][j]; } return result; } Kruskal算法简述 Kruskal算法与Prim算法的不同之处在于,Kruskal在找最小生成树结点之前,需要对所有权重边做从小到大排序。将排序好的权重边依次加入到最小生成树中,如果加入时产生回路就跳过这条边,加入下一条边。当所有结点都加入到最小生成树中之后,就找出了最小生成树。 void kruskal(int t) { int i,num,min,k,g; for(i=1;i=n;i++) x[i] = i; sort(a+1,a+t+1,cmp); min=0; num=1;

文档评论(0)

wendang_12 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档