又是一个并查集的题目,这个题目的意思就是刚开始房间里有10000000个人,然后现在让你选择出来部分人,要求是这些人是朋友(直接的和间接的),然后要求选出来的这个组人数要求是最多的。这个题目和virtual friends的做法是相同的,都是设置一个数组来记录包括这个人的朋友圈当前有多少人。最后只需要遍历一遍看看哪一个的father[i]==i然后选出来那个的sum要求是最大的。
下面是代码。
#include<iostream>
#include<stdio.h>
using namespace std;
int father[10000005],sum[10000005];
int find_ant(int n)
{
if(n!=father[n])
{
father[n]=find_ant(father[n]);
}
return father[n];
}
void unin(int x,int y)
{
int x_x,y_y;
x_x=find_ant(x);
y_y=find_ant(y);
if(x_x!=y_y)
{
father[x_x]=y_y;
sum[y_y]+=sum[x_x];
}
}
int main()
{
int n,a,b,i,maxi;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=10000000;i++)
{
sum[i]=1;
father[i]=i;
}
for(i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
unin(a,b);
}
maxi=-1;
for(i=1;i<=10000000;i++)
if(father[i]==i&&sum[i]>maxi)
maxi=sum[i];
cout<<maxi<<endl;
}
return 0;
}