【并查集】

并查集:查,并;

查:

int find(int x)
{
	if(p[x]!=x) p[x]=find(p[x]);
	return p[x];
}

并:

void unionn(int a,int b)
{
	int r1 = find(a);
	int r2 = find(b);
	p[r2] = r1;
}

对p[N]进行初始化

for(int i = 1;i <= n;i ++) p[i] = i;

从1到n开始进行初始化;

二、记录并查集的元素个数的方法:

1、让大数服从小数

int a,b;
cin >> a >> b;
if(a>b) swap(a,b);
if(find(a)!=find(b)) unionn(a,b);
//查询和h相连个数
for(int i = 1;i <= n;i++) 
    if(find(p[i])==find(h)) 
        ans++;

2、创造一个数组cnt[N]用来存储个数;

每次一次合并,同时将cnt[i]合并相加;

for(int i = 1;i <= n;i ++) cnt[i] = 1;//cnt[]初始化;
while(t--){
int a,b;
cin >> a >> b;
if(a>b) swap(a,b);
if(find(a)!=find(b)) unionn(a,b);
    cnt[find(a)] += cnt[find(b)];//合并个数;
}

//查询和h想连的个数;
ans = cnt[find(a)];

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幼儿园大哥7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值