您的位置首页生活小窍门

克鲁斯卡尔算法

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

克鲁斯卡尔算法

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

以下给出并查集实现的克鲁斯卡尔算法,求解生成网消达价行凯已翻量除古络的最小费用,并输出生蒸越行斤歌若成网络里的路径。

#include<iostream>

#include<algorithm>

usi测左岩拉层绍杂ngnamespacestd;

intp[1001],rank[1001];

intcho[1001];

s孔对率赵tructedge

{

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&lt城黄首春燃书;b.w;

}

intF点入ind(intt)

{

if(p[t]!=t)

{

p[t]=Find(p[t]);

}

returnp[t];

}

intUnion(inta,intb)

{

intx,y;

x=Fin区交值终者湖七集执防d(a);

y=Fi川陈航著宗山示单第哪nd(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(F划线向官什单故州握生ind(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;

}

}

printf("%d\n",ans);

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

{

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

}

return0;

}