题干:洛谷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]); }
原文:https://www.cnblogs.com/xianyi-yk/p/12853690.html