首页 > 编程知识 正文

克鲁斯卡尔算法求解过程,克鲁斯卡尔算法适用于什么图

时间:2023-05-03 14:15:33 阅读:157100 作者:151

关于Kruskal算法,这里有博客。 最小生成树的Kruskal算法。 总结要点:

这是最小生成树的另一种算法,要求全长之和最短。 那么,首先将图的路径权重从小到大排列,最终连接到n-1条边上。 如果按照排列的顺序连接,则在连接的过程中可能有几个点相连。 在这种情况下,需要使用一组顶部和底部来确定两个顶点是否相连。

一组测试数据:

输入:

6 9 2 4 11 3 5 13 4 6 3 5 6 4 2 3 6 4 5 7 1 2 1 3 4 9 1 3 2

输出:

19

代码:

# include cstdio # include cstring # includecstdlib # include cmath # include string # include iostream # include stack # include queque b ) memset(a ) a、b、sizeof(a ) a ) ) definen 10020 # definem 100000020 # define mod 10000000007 struct node { int u; int v; int w; } map[10]; int n,m; int f[7]={0},sum=0,cnt=0; //并置校验集是intGETF(intv )//在并置校验集中查找祖先(if ) f ) v )==v ) return v; else { //路径压缩f[v]=GETF(f[v]; return f[v];//两个子集intmix(intv,int u ) int u,t2; T1=GETF(v; T2=GETF(u; if(T1!=t2 )//判断两个点是否位于同一集合中({ f[t2]=t1; 返回1; } return 0; }boolCMP(nodex,node y ) ) { return x.wy.w; (}int main ) ) Scanf('%d%d”,n,m ); for(intI=1; i=m; I ) scanf('%d%d )、map[i].u、map[i].v、map[i].w ); sort(map1、map m 1、cmp ); //并置校验集初始化for(intI=1; i=n; I ) f(I )=I; //奇异招牌(Kruskal )算法的核心内容for(intI=1; i=m; () ) ) ) ) 0000000000000000000000000000000000000000000000000000000000000000 m=map [ I ].w (if ) CNT==n-1 )选择n-1边后退出循环break; }printf('%d”,sum ); 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。