并查集维护集合中点的数量

并查集 

两个bug调了一个小时
1、合并两个集合时
    如果没有按照下面的写法即省去这一步a=find(a),b=find(b);
    则合并根节点的顺序与更新更新集合得顺寻不能互换,
    必须要先把原来根节点中元素的数量加到所要合并的
    根节点上去再把根节点合并
                a=find(a),b=find(b);
                cnt[b]+=cnt[a];
                p[a]=b;
2、路径压缩
一定不要忘记路径压缩不然会超时!!!
```
 

#include"bits/stdc++.h"
using namespace std;
const int N=1e5+10;
int p[N],cnt[N];
int n,m;
int find(int x)
{
     if(p[x] != x)  p[x] = find(p[x]);
     return p[x];
}
int main()
{
    cin.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)   {p[i]=i;cnt[i]=1;}
    while(m--)
    {
        string str;
        int a,b;
        cin>>str;
        if(str=="C")
        {
            cin>>a>>b;
            if(find(a)!=find(b))   
            {
                a=find(a),b=find(b);
                cnt[b]+=cnt[a];
                p[a]=b;
                
            }
        }
        else if(str=="Q1")
        {
            cin>>a>>b;
            if(find(a)==find(b))    cout<<"Yes"<<endl;
            else                    cout<<"No"<<endl;
        }
        else
        {
            cin>>a;
            cout<<cnt[find(a)]<<endl;
        }
    }
    return 0;
}

posted @   cxy8  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示