当前位置:大问百书>百科问答>克鲁斯卡尔算法

克鲁斯卡尔算法

2024-11-30 10:04:26 编辑:zane 浏览量:574

克鲁斯卡尔算法

的有关信息介绍如下:

问题补充说明:在n个城市间建立通信网,只需建立n-1条线路。利用克鲁斯卡尔算法求网的最小生成树,利用堆排序对边集合先排序。要利用邻接表建立图的存储结构谢了啊!我真的不会啊!

克鲁斯卡尔算法

你确定要用邻接表吗?因为在克鲁斯卡尔算法里只需要存储边及费用,用邻接表意义不大,还不好来自排序。

以下给出并查集实现的克鲁斯卡尔算法,求解生成网络的最小费用,并输出生成网络里的路径。

#include<iostream>

#include<algorithm>

360问答usingnamespacestd;

intp[1001足边尽家守景距一慢丰],rank[1001]输衣婷研用突质显对;

intcho[1稳差001];

structedge

{

intu,v,w;//u表示起始点编号,v表示终点编号,w表示该路径费用

}e[15001];

intn,m;//n表示点的个数,m表示路径数

voidInit()

{

inti;

for(i=1;i<=n;南导议周仅半倍况学确快i++)

{

p[i]=i;

rank[i]=0;

}

}

boolcmp(edgea,团革优跳治究结愿举edgeb)

{

returna.w<b.w;

}

intFind(i很准外体医导ntt)

{

if(p[t]!=t)

{

p[t]德皇宗=Find(p[t]);

}

returnp[t];

}

in火居小tUnion(inta,intb)

{

intx,y;

x=Find(a);

y=Find(b);

if今明做预盐互料顶念待陈(rank[x]>rank[y])

{

p[y]=x;

}

else

{

p[x]=y;

if(rank[x]==rank[y])

rank[y]++;

}

return0;

}

intmain()

{

scanf("%d%d",&n,&m);

inti,j;

for(i=0;i<m;i++)

{

scanf("%d%d础接%d",&e[i].u,&e[i].v,&e[i].w);

}

Init();

sort(e同伯房始失家,e+m,cmp);

intcnt=0,ans=0;

for(i=0;i<m;i++)

{

if(Find(e[i].若换陈激真u)!=Find(e[i].远v))

{

cnt++;

ans+=e[i].w;

Union(e[i].u,e[i].v);

cho[++cho[0]]=i;

if(cnt==流象映海室停唱有露刻n-1)

break;

}

}

p背重久rintf("%d\n",事通唱ans);

for(j=1;j<=cho[0];j++)

{

printf("%d%d\n",e[cho[j]].u,e[cho[j]].v);

}

re所没济turn0;

}

版权声明:文章由 大问百书 整理收集,来源于互联网或者用户投稿,如有侵权,请联系我们,我们会立即处理。如转载请保留本文链接:https://www.dawenbaishu.com/answer/210444.html
热门文章