#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 1e7 + 5;
int n;
struct node
{
int op;
int ed;
} edge[maxn];
int root[maxn];
int num[maxn];
int Find(int x)
{
return root[x] == x ? x : root[x] = Find(root[x]);
}
int main()
{
while(~scanf("%d", & n))
{
for(int i = 0; i < n; i ++)
scanf("%d %d", & edge[i].op, & edge[i].ed);
for(int i = 1; i < maxn; i ++) //初始化
{
root[i] = i; //所有的root与下标相等(即根节点是自己本身)
num[i] = 1; //所有的数量为1
}
for(int i = 0; i < n; i ++)
{
int x = Find(edge[i].op);
int y = Find(edge[i].ed);
if(x != y)
{
root[y] = x; //不断连接(y的根节点是x)
num[x] += num[y]; //不断将叶节点的数量累加到根节点
}
}
int num_max = 1;
for(int i = 1; i < maxn; i ++)
if(num[i] > num[num_max])
num_max = i; //找最大数量
printf("%d\n", num[num_max]);
}
return 0;
}
题意:
王老师要找一些男生帮助他完成一项工程。要求最后挑选出的男生之间都是朋友关系,可以说直接的,也可以是间接地。问最多可以挑选出几个男生(最少挑一个)。
题解:
(摘自LYHVOYAGE)这是一个有关并查集的题目。只不过不是求有几个集合,而是求每个集合中元素的个数,进而求出个数的最大值。和求集合个数的方法差不多,只需要在合并两个集合时处理一下,让这两个集合的元素个数也合并一下就行了。接下来只需要找出最大值即可。