题意:A与B是朋友,B与C是朋友,那么A与C也是朋友,问一个朋友圈中最多有多少人。
思路:并查集
Find函数找自己归属队伍
Union函数将x和y合并为一个队伍
最好在通过遍历每个人,找出最大的朋友圈(队伍)。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#define INF 0x7fffffff
using namespace std;
int fa[30005],b[30005];
int Find(int x)
{
if(x!=fa[x])
fa[x]=Find(fa[x]);
return fa[x];
}
void Union(int x,int y)
{
int a=Find(x);
int b=Find(y);
if(a!=b)
fa[a]=b;
}
int main()
{
int T,n,m,x,y,z;
scanf("%d",&T);
while(T--)
{
memset(fa,0,sizeof(fa));
memset(b,0,sizeof(b));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
fa[i]=i;
while(m--)
{
scanf("%d%d",&x,&y);
Union(x,y);
}
int ans=0;
for(int i=1;i<=n;i++)
{
z=Find(i);
ans=max(ans,++b[z]);
}
printf("%d\n",ans);
}
return 0;
}