并查集的最大集合与集合个数

本文介绍了如何利用并查集解决找到最大集合和集合个数的问题。通过在并查集中增加一个记录数组num[],可以追踪每个元素的权值最大值和最大集合的元素个数。具体实现过程包括接收直接朋友对,判断朋友关系,并最终确定最大保留人数。例如,给定直接朋友对后,{1,2,5,6}是最佳答案,输出为4。" 87857230,8005952,SSM与MybatisPlus整合实战指南,"['Spring框架', 'SpringMVC', 'MyBatis', 'MybatisPlus', '数据库整合']
摘要由CSDN通过智能技术生成

并查集的最大集合:就是指输入所有关系后,分成了很多的不同集合,最大集合就是那些不同的集合种包含元素最多的集合所包含的元素的多少。

集合个数:就是指输入所有关系后,这些不同集合有多少个。

解决思路:

就是在普通的并查集模板中加入一个记录数组num[],这个数组可以标记每个元素的权值的最大和和最大集合的元素个数。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define INF 0x3f3f3f3f
#define ONF 0xc0c0c0c0
using namespace std;
typedef long long ll;
int par[10000005],num[10000005];
void init(int n)
{
    for(int i=1;i<=n;i++)
    {
        par[i]=i;
        num[i]=1;//这里是求最大集合的个数,如果求最后集合中权值最大为多少就让num数组初始化为最开始各个元素的权值。
    }
}
int get_par(int x)
{
    return par[x]==x?x:par[x]=get_par(par[x]);
}
void doit(int x,int y)
{
    int dx=get_par(x);
    int dy=get_par(y);
    if(dx!=dy)
    {
        par[dx]=dy;
        num[dy]=num[dx]+num[dy];
    }
}
int main()
{
    in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值