#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,l1,a,fa[200],am[200];
struct edge{
int x,y,v;
}e[20000];
void init()
{
for(int i=0;i<n;i++)
{
fa[i] = i;
am[i] = 1;
}
}
bool cmp(edge x,edge y)
{
return x.v<y.v;
}
int findFarther(int x)
{
while(fa[x]!=x){
x = fa[x];
}
return x;
}
bool Union(int x,int y)
{
int rootx = findFarther(x),rooty = findFarther(y);
if(rootx!=rooty){
if(am[rootx]>am[rooty]){
fa[rooty] = rootx;
am[rootx]+=am[rooty];
}
else{
fa[rootx] = rooty;
am[rooty]+=am[rootx];
}
return true;
}
else return false;
}
int kruskal()
{
int sum = 0,sum2 = 0;
for(int i=0;i<l1;i++)
{
if(Union(e[i].x,e[i].y)){
sum2++;
sum+=e[i].v;
}
}
if(sum2==n-1)return sum;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
l1 = 0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&a);
e[l1].x = i;
e[l1].y = j;
e[l1].v = a;
l1++;
}
sort(e,e+l1,cmp);
printf("%d\n",kruskal());
}
return 0;
}
poj-1258-最小生成树kruskal模板
最新推荐文章于 2020-01-15 00:21:32 发布
本文介绍了一种使用Kruskal算法求解最小生成树问题的方法。通过C++代码实现了图的边集数组表示法,并利用并查集进行优化,确保每次合并操作能够正确更新集合信息。文章详细解释了如何初始化并查集、比较边权重以及寻找顶点所属集合的过程。

407

被折叠的 条评论
为什么被折叠?



