HDU-1856 More is better

本文介绍了一个并查集的应用实例,用于解决在一组男生中寻找最多可以挑选出的互为朋友关系的男生数量的问题。通过并查集的操作,我们可以高效地合并集合并计算最大集合的元素个数。
#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)这是一个有关并查集的题目。只不过不是求有几个集合,而是求每个集合中元素的个数,进而求出个数的最大值。和求集合个数的方法差不多,只需要在合并两个集合时处理一下,让这两个集合的元素个数也合并一下就行了。接下来只需要找出最大值即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值