连通块中点的数量(带条件的并查集)

例题:

image

 输入样例:

5 5
C 1 2
Q1 1 2
Q2 1
C 2 5
Q2 5

预期输出:

Yes
2
3

代码实现:

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5+10;
int p[N],res[N];
int n,m;
int a,b;

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

    return p[x];
}

int main()
{
    for(int i=0;i<N;i++)
    {
        p[i] =i;
        res[i] =1;
    }
    cin>>n>>m;
    while(m--)
    {
        char op[3];
        scanf("%s",op);
        if(op[0] == 'C')
        {

            cin>>a>>b;
            if(find (a) == find(b));
            else
            {
                //int k =find(a);
                res[find(b)]=res[find(b)]+res[find(a)];
                //res[k]=0;    //一开始想的是子节点的记录值全部置零,但是没必要,因为最后输出的也是根节点的res值,故子节点的res值无效。
                p[find(a)] = find(b);
            }
        }

        else if (op[1] =='1')
        {
            cin>>a>>b;
            if(find (a) == find(b)) cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }
        else
        {
            cin>>a;
            cout<<res[find(a)]<<endl;
        }
    }
}

  

posted @ 2025-09-07 22:09  小花护符  阅读(8)  评论(0)    收藏  举报