#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int e[N], n, m;
int find(int x)
{
if (e[x] != x) //如果这个数的父节点不等于本身,就继续寻找这个数的祖宗
{
find(e[x]);
}
return e[x];
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
e[i] = i; //最开始1~n每个数都属于一个集合
}
char c;
int a, b;
while (m--)
{
cin >> c;
if (c == 'M')
{
cin >> a >> b;
if (find(a) != find(b)) //如果这两个数的祖宗结点不是一个(及不在一个集合)
{
e[find(a)] = find(b); //就让a的祖宗结点指向b的祖宗结点
}
}
else
{
cin >> a >> b;
if (find(a) == find(b)) //如果两个在一个集合
cout << "yes" << endl;
else
cout << "no" << endl;
}
}
return 0;
}
算法小白的学习日记--并查集