王先生想要一些男孩帮助他做一个项目。因为项目比较复杂,男生来的越多越好。当然也有一定的要求。 王先生选了一个足够容纳男孩子的房间。没有被选中的男孩必须立即离开房间。房间里一开始就有1000万男孩,编号从1到1000万。王先生选了以后,在这间屋子里的任何两个都应该是朋友(直接或间接),否则就只剩下一个男孩了。鉴于所有直接的朋友对,您应该决定最佳方式。 输入 输入的第一行包含一个整数 n (0 ≤ n ≤ 100 000) - 直接朋友对的数量。以下 n 行每行包含一对数字 A 和 B,由一个空格分隔,表明 A 和 B 是直接朋友。(A≠B,1≤A,B≤10000000) 输出 一行中的输出正好包含一个整数,等于王先生可以保留的最大男孩数。
样本输入
4
1 2
3 4
5 6
1 6
4
1 2
3 4
5 6
7 8
样本输出
4 2
#include<bits/stdc++.h>
using namespace std;
int father[10000001];
int num[10000001];
int find(int x)
{
if(father[x]!=x) father[x]=find(father[x]);
else return father[x];
}
int main()
{
int m;
while((scanf("%d",&m))!=EOF)
{ int maxn=1;
for(int i=1;i<=10000000;i++)
{
father[i]=i;num[i]=1;
}
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
int r1=find(x);
int r2=find(y);
if(r1!=r2)
{
father[r2]=r1;
num[r1]+=num[r2];
if(maxn<num[r1])maxn=num[r1];//优化,在合并时比较
}
}
cout<<maxn<<endl;
}
}