天天看點

合并集合

一共有n個數,編号是1~n,最開始每個數各自在一個集合中。

現在要進行m個操作,操作共有兩種:

“M a b”,将編号為a和b的兩個數所在的集合合并,如果兩個數已經在同一個集合中,則忽略這個操作;

“Q a b”,詢問編号為a和b的兩個數是否在同一個集合中;

輸入格式

第一行輸入整數n和m。

接下來m行,每行包含一個操作指令,指令為“M a b”或“Q a b”中的一種。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[100010];
int find(int x)
{
  if(a[x] != x)
  return a[x] = find(a[x]);
  return a[x];
}
void join(int x,int y)
{
  a[find(x)] = a[find(y)];
}
int main()
{
  int  n,m;
  scanf("%d%d",&n,&m);
  for(int i = 1; i <= n; i++)
  a[i] = i;
  while(m--)
  {
    char op;
    scanf(" %c",&op);
    int a,b;
    scanf("%d%d",&a,&b);
    if(op == 'M')
    {
      join(a,b);
    }
    else
    {
      if(find(a) == find(b))
      printf("Yes\n");
      else
      printf("No\n");
    }
  }
}