题意:求一共有多少不相交的集合
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6;
int parent[maxn],ranc[maxn];
int serc(int pos)
{
while(parent[pos]!=pos)
{
pos=parent[pos];
}
return pos;
}
void init(int siz)
{
for(int i=0;i<siz;i++)
{
parent[i]=i;
ranc[i]=1;
}
}
void merg(int x,int y)
{
x=serc(x);
y=serc(y);
if(ranc[x]<ranc[y])
parent[x]=parent[y];
else
{
if(ranc[x]==ranc[y])ranc[x]++;
parent[y]=parent[x];
}
}
void compress(int pos)
{
int tpos=serc(pos);
int cur;
while(parent[pos]!=pos)
{
cur=parent[pos];
parent[pos]=tpos;
pos=cur;
}
}
int main()
{
int t,m,n,cur1,cur2;
cin>>t;
while(t--)
{
cin>>n>>m;
init(n);
for(int i=0;i<m;i++)
{
cin>>cur1>>cur2;
merg(cur1-1,cur2-1);
}
int sum=0;
for(int i=0;i<n;i++)
{
if(parent[i]==i)sum++;
}
cout<<sum<<endl;
}
return 0;
}
本文详细介绍了并查集算法的基本概念及其应用,并通过一个具体的实现案例来解释如何使用并查集算法来解决实际问题,例如统计不相交的集合数量。
594

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



