题目理解:输入n组数,每组数包括两个数,表示这两个数有关系。输入n组数后,有关系的数就构成一棵树。题目要求找出最大树的节点个数。
思路:用并查集。把每棵数看作一个集合,把每个节点指向同一个父节点。最后统计以某节点为父节点的集合中有几个元素,输出最大集合的元素个数。
#include<iostream>
using namespace std;
long father[100010];
long count[100010];
long find(int x)
{
if(father[x]!=x)
father[x]=find( father[x] );
return father[x];
}
main()
{
long n,i;
long x,y;
long f,max;
long f1,f2;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=100010;i++)
father[i]=i;
memset(count,0,sizeof(count));
while(n--)
{
scanf("%d%d",&x,&y);
f1=find(x);
f2=find(y);
if(f1!=f2)
father[f2]=f1;
}
for(i=1;i<=100000;i++)
{
f=find(i);
count[f]++;
}
max=0;
for(i=1;i<=100000;i++)
{
if(max<count[i])
max=count[i];
}
cout<<max<<endl;
}
}