并查集的路径压缩上的一些操作

本文介绍了一种利用并查集优化队列合并的算法。通过将一个队列插入到另一个队列的后面,避免了暴力修改每个人后面人数的耗时操作。在并查集的路径压缩过程中,记录并更新节点信息,实现高效的人数统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

如果Y不在X所在的对立里的话,将Y所在的队列插入到X所在的队列后面,并询问某个人后面有多少人。

题解

使用并查集,将一个队伍插入到另一个队伍后面,将会改变一个队伍里面某个人后面的人数值,如果暴力修改很耗时间,所以采用并查集的做法,两个队伍合并的时候,将X的队尾连上Y的队头,这时候知道X的后面的人数便是Y里面的人数,那X队伍里面的人呢?这时候就用到了并查集路径压缩的过程。
在这里插入图片描述
在路径压缩的过程中,首先先记录下此时的pre[x],例如要压缩3的路径,pre[x] = find(pre[x]),压缩后pre[3] = 1,但是压缩的过程是会经过2的,首先在pre[x] = find(pre[x])之前记录下当前的pre[x] = 2,当pre[x] = find(pre[x])结束后,2结点的值已经被1结点更新了,所以这时可以将2结点的信息再更新到3上面。

ans[i]: i后面有多少人, num[i]: i所在的队列有多少人

    int fx = find(x), fy = find(y);
    if(fx != fy) {
        pre[fx] = fy;
        ans[fx] = num[fy];
        num[fy] += num[fx];
    }
int find(int x) {
    if(x == pre[x])
        return x;
    int tmp = pre[x];
    pre[x] = find(pre[x]);
    ans[x] += ans[tmp];
    return pre[x];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值