一共有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");
}
}
}