并查集简单题
code:
union_s(int ,int);合并操作因题而异,该题目不需要进行深度优化,因为需要链表模式,节点之间需要成单链来计算一个根节点的节点数
最后其实卡在了根节点的节点数🤔
#include <iostream>
using namespace std;
const int maxn=30000+5;
int s[maxn];
int h[maxn];
void init(int nn)
{
for(int i=0; i<nn; i++)
{
s[i]=i;
h[i]=1;
}
}
int find_s(int x)
{
return x==s[x]?x:find_s(s[x]);
}
void union_s(int x,int y)
{
int i=find_s(x);
int j=find_s(y);
if(i!=j)
{
s[j]=i;
h[i]+=h[j];
}
/*if(h[x]==h[y])
{
h[x]++;
s[y]=i;
}else
{
if(h[x]<h[y])
s[x]=j;
else
s[y]=i;
}*/
}
int main()
{
int n,m,xx,yy,k;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
init(n);
while(m--)
{
cin>>k;
cin>>xx;
k--;
while(k--)
{
cin>>yy;
union_s(xx,yy);
}
}
cout<<h[find_s(0)]<<endl;//cout<<h[0]<<endl;cout<<h[s[0]]<<endl;
}
return 0;
}