原题传送门
#include <iostream>
using namespace std;
int loop[10010];//查找上一级
int find_root(int leaf)
{
if (loop[leaf] == leaf)
return leaf;
else
return loop[leaf] = find_root(loop[leaf]);//原来是没有loop[leaf]=的,意为递归查找上一级的根
//添加loop[leaf]=是为了优化,缩短查找路径
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
loop[i] = i;
}
int x, y, z;
for (int i = 0; i < m; i++)
{
cin >> x >> y >> z;
if (x == 1)
{
loop[find_root(y)] = find_root(z);//把y的根,系到z的根上
}
else
{
cout <<( (find_root(y) == find_root(z)) ? 'Y' : 'N')<<endl;//找根
}
}
// system("pause");
}