【数据结构】并查集模板
题干:洛谷P3367
题目描述
如题,现在有一个并查集,你需要完成合并和查询操作。
输入格式
第一行包含两个整数 N,MN,MN,M ,表示共有 NNN 个元素和 MMM 个操作。
接下来 MMM 行,每行包含三个整数 Zi,Xi,YiZ_i,X_i,Y_iZi,Xi,Yi 。
当 Zi=1Z_i=1Zi=1 时,将 XiX_iXi 与 YiY_iYi 所在的集合合并。
当 Zi=2Z_i=2Zi=2 时,输出 XiX_iXi 与 YiY_iYi 是否在同一集合内,是的输出 Y
;否则输出 N
。
输出格式
对于每一个 Zi=2Z_i=2Zi=2 的操作,都有一行输出,每行包含一个大写字母,为 Y
或者 N
。
#include <iostream> using namespace std; int par[10005]; int find(int x); int unit(int x, int y); int main() { int N, M; cin >> N >> M; for (int i = 0; i < 10005; i++) par[i] = i; for (int i = 0; i < M; i++) { int sel,x,y; cin >> sel >> x >> y; if (sel == 1) unit(x, y); else if (sel == 2) { int x1 = find(x); int y1 = find(y); if (x1 == y1) cout << "Y" << endl; else cout << "N" << endl; } } return 0; } int unit(int x,int y) { int x1 = find(x); int y1 = find(y); par[x1] = y1; return 0; } int find(int x) { return par[x] == x ? x : par[x] = find(par[x]); }