题目描述
如题,现在有一个并查集,你需要完成合并和查询操作。
输入格式
第一行包含两个整数 N,M ,表示共有 N 个元素和 M 个操作。
接下来 M 行,每行包含三个整数 Zi,Xi,Yi 。
当 Zi=1 时,将 Xi 与 Yi 所在的集合合并。
当 Zi=2 时,输出 Xi 与 Yi 是否在同一集合内,是的输出 Y
;否则输出 N
。
输出格式
对于每一个 Zi=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
本题为模板题,只需要实现并查集的主要功能即可。
数据范围较大,需加入路径压缩。
#include<bits/stdc++.h>
using namespace std;
vector<int> pre;
int find(int x){if(x != pre[x]){pre[x] = find(pre[x]); // 路径压缩}return pre[x];
}
int main(){int n, m;cin>>n>>m;pre.resize(n+1);for(int i = 1;i<=n;i++){pre[i] = i;}for(int i = 0;i<m;i++){int z, x, y;cin>>z>>x>>y;if(z==1){int a = find(x);int b = find(y);pre[a] = b;}if(z==2){int a = find(x);int b = find(y);bool flag = (a==b);if(!flag) cout<<"N"<<endl;else cout<<"Y"<<endl;}}return 0;
}