int Map[Max][Max];
int father[Max];///存放根节点
int n,m;
struct node
{
int a,b,c;
}p[50005];
int cmp(node p1,node p2)///边的排序按照权值从小到大排列
{
return p1.c<p2.c;
}
int Find(int i)///寻找点i的根节点
{
return i==father[i]?i:father[i]=Find(father[i]);
}
void Merge(int a,int b)///连接两个点
{
int fa=Find(a);
int fb=Find(b);
if(fa!=fb) ///判断是否连通
father[fb]=fa; ///不连通则将两点连通
}
void Kruskal()
{
int k=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
if(Map[i][j]!=INF&&Map[i][j]!=0)
{ ///初始化,将边进行整理
p[k].a=i;
p[k].b=j;
p[k].c=Map[i][j];
k++;
}
sort(p,p+k,cmp);///将边按照升序排序
for(int i=1;i<=n;i++)
father[i]=i; ///初始化根节点
int j=1; ///记录当前访问的第几条边
k=0; ///记录加入树中的边数
int sum=0;///记录整棵树的权值
while(j<m&&k<n)///k<n是因为N个点,连通各点一次仅需要n-1条边
{
int fa=Find(p[j].a);
int fb=Find(p[j].b);
if(fa!=fb) ///不连通,即没有回路,加入树中
{
sum+=p[j].c; ///权值增加
k++; ///边数增加
Merge(p[j].a,p[j].b); ///将其连为一个整体
}
j++; ///检测下一条边
}
cout<<sum<<endl;
}
例题:
https://blog.csdn.net/a17865569022/article/details/79854778
Kruskal模板
最新推荐文章于 2022-01-18 16:20:20 发布