/*
简单的并查集题目,其实就是求图的最大连通块的顶点的个数,
要注意的一点是。root[i] != FindSet(i);
由于并查集单向合并的原因,因此root[i]不一定是i的根节点,FindSet(i)才是!
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 30010;
int root[N];
int ans[N];
void InitSet(int n)
{
for(int i = 1 ; i <= n ; i++)
{
root[i] = i;
ans[i] = 0;
}
}
int FindSet(int n)
{
if(n != root[n])
{
root[n] = FindSet(root[n]);
}
return root[n];
}
void UnionSet(int n,int m)
{
int x = FindSet(n);
int y = FindSet(m);
if(x != y)
{
root[y] = x;
}
}
int main()
{
int ncase;
scanf("%d",&ncase);
while(ncase--)
{
int n,m;
scanf("%d %d",&n,&m);
InitSet(n);
for(int i = 0 ; i < m ; i++)
{
int a,b;
scanf("%d %d",&a,&b);
UnionSet(a,b);
}
for(int i = 1; i <= n ; i++)
{
int x = FindSet(i);
ans[x]++;
}
int maxx = -1;
for(int i = 1 ; i <= n ; i++)
{
if(maxx < ans[i])
{
maxx = ans[i];
}
}
cout<<maxx<<endl;
}
return 0;
}
uva 10608 - Friends (并查集)
最新推荐文章于 2019-09-01 08:58:38 发布