题目描述
如题,现在有一个并查集,你需要完成合并和查询操作。
输入格式
第一行包含两个整数 N,MN,M ,表示共有 NN 个元素和 MM 个操作。
接下来 MM 行,每行包含三个整数 Z_i,X_i,Y_iZ
i
,X
i
,Y
i
。
当 Z_i=1Z
i
=1 时,将 X_iX
i
与 Y_iY
i
所在的集合合并。
当 Z_i=2Z
i
=2 时,输出 X_iX
i
与 Y_iY
i
是否在同一集合内,是的输出 Y ;否则输出 N 。
输出格式
对于每一个 Z_i=2Z
i
=2 的操作,都有一行输出,每行包含一个大写字母,为 Y 或者 N 。
输入输出样例
输入 #1复制
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
输出 #1复制
N
Y
N
Y
说明/提示
对于 30%30% 的数据,N \le 10N≤10,M \le 20M≤20 。
对于 70%70% 的数据,N \le 100N≤100,M \le 10^3M≤10
3
。
对于 100%100% 的数据,1\le N \le 10^41≤N≤10
4
,1\le M \le 2\times 10^51≤M≤2×10
5
。
#include <bits/stdc++.h>
using namespace std;
int n,m,zi,xi,yi;
int f[10000];
int find(int x)
{
if(x==f[x]) return x;
else return f[x]=find(f[x]);
}
int main()
{
std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=m;i++)
{
cin>>zi>>xi>>yi;
if(1==zi) f[find(xi)]=find(yi);//降低空间复杂度
// f[xi]=yi;
else if(2==zi)
{
if(find(xi)==find(yi)) cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
}
return 0;
}