使用并查集算法
#include<bits/stdc++.h>
using namespace std;
int arr[30010]={0};
int fi(int x)//查找根节点
{
if(arr[x]==x)
{
return x;
}
fi(arr[x]);
}
void hb(int x,int y)//合并
{
x=fi(x);
y=fi(y);
if(x!=y) arr[x]=arr[y];
}
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
{
int n,m;
cin>>n>>m;
for(int j=1;j<=n;j++)
{
arr[j]=j;
}
int a,b;
for(int k=0;k<m;k++)//先合并
{
cin>>a>>b;
hb(a,b);
}
for(int p=1;p<=n;p++)//优化查找
{
arr[p]=fi(p);
}
int ans[30010]={0};
for(int l=1;l<=n;l++)//统计最大集合的人数
{
ans[arr[l]]++;
}
int ma=-1;
for(int o=1;o<=n;o++)
{
ma=max(ma,ans[o]);
}
cout<<ma<<endl;
}
}

京公网安备 11010502036488号