并查集,实际就是统计图中最大连通分支中节点的个数。
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
const int MAXN = 30002;
int friends[MAXN], p[MAXN];
int find(int x)
{
return p[x] == x ? x : (p[x] =find(p[x]));
}
int main()
{
#ifdef test
freopen("sample.txt", "r", stdin);
#endif
int m, n, t, x, y, u, v, _max;
scanf("%d", &t);
while(t--)
{
_max = 0;
scanf("%d%d", &n, &m);
memset(friends, 0, (n+1)*sizeof(friends[0]));
for(int i=1; i<=n; i++)
p[i] = i;
for(int i=0; i<m; i++)
{
scanf("%d%d", &x, &y);
u = find(x);
v = find(y);
if(u != v)
p[u] = v;
}
for(int i=1; i<=n; i++)
{
x = find(i);
++friends[x];
}
for(int i=1; i<=n; i++)
if(friends[i] > _max)
_max = friends[i];
printf("%d\n", _max);
}
return 0;
}