克鲁斯卡尔算法
的有关信息介绍如下:问题补充说明:在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;
}