AcWing 836. 合并集合

共有n个数,编号是1~n,最开始每个数各自在一个集合中。

现在要进行m个操作,操作共有两种:

  1. “M a b”,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
  2. “Q a b”,询问编号为a和b的两个数是否在同一个集合中
    #include<bits/stdc++.h>
    using namespace std;
    const int N =1e5+10;
    int p[N];
    int find(int a)
    {
        if (p[a]!=a)p[a]=find(p[a]);
        return p[a];
    }
    
    int main()
    {
        int n, m;
        scanf("%d %d",&n,&m);
        for (int i=1;i<=n;i++)p[i]=i;
        int a,b;
        char op[2];
        while (m--)
        {
            scanf("%s %d%d",op,&a,&b);
            if (op[0]=='M') p[find(a)]=find(b);
            else {
                if (find(a)==find(b)) puts("Yes");
                else puts("No");
            }
        }
        return 0;
    }

     

posted @ 2021-01-08 17:04  君与  阅读(58)  评论(0)    收藏  举报