问题补充说明:在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<城黄首春燃书;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;
}