// 初始化 voidinital(int n, int parent[], int height[]){ for (int i = 1; i <= n; i++) { parent[i] = i; height[i] = 0; } return ; } // 路径压缩 intfind_root(int x, int parent[]){ if (parent[x] != x) { parent[x] = find_root(parent[x], parent); } return parent[x]; // }
// 路径压缩--非递归版 intfind_root1(int x, int parent[]){ int k = x; while (parent[k] != k) { k = parent[k]; } while (x != k) { int temp = parent[x]; parent[x] = k; x = temp; } return k; }
voidmerge(int x, int y, int parent[], int height[]){ int x_root = find_root(x, parent); int y_root = find_root(y, parent); if (x_root != y_root) { // parent[x_root] = y_root; // 原先代码 // 按秩合并 if (height[x_root] == height[y_root]) { parent[x_root] = y_root; // 相等让y的树高 +1 height[y_root]++; } elseif (height[x_root] > height[y_root]) { parent[y_root] = x_root; } else { parent[x_root] = y_root; } return ; } mark = 1; return ; }
intmain(){ int n, m, parent[MAX_N + 10], height[MAX_N + 10]; cin >> n >> m; inital(m, parent, height); for (int i = 0; i < n; i++) { int x, y; cin >> x >> y; merge(x, y, parent, height); } if (mark) cout << "有环!" << endl; elsecout << "无环!" << endl; return0; }
// 初始化 voidinital(int n, int parent[]){ for (int i = 1; i <= n; i++) { parent[i] = i; } return ; }
intfind_root(int x, int parent[]){ if (parent[x] != x) { parent[x] = find_root(parent[x], parent); } return parent[x]; }
voidmerge(int x, int y, int parent[]){ int x_root = find_root(x, parent); int y_root = find_root(y, parent); if (x_root != y_root) { parent[x_root] = y_root; return ; } mark = 1; return ; }
intmain(){ int n, m; // 组数 最大值 cin >> n >> m; inital(m, parent); for (int i = 0; i < n; i++) { int x, y; cin >> x >> y; merge(x, y, parent); } if (mark) cout << "有环!" << endl; elsecout << "无环!" << endl; return0; }
intfind_root(UnionSet *U, int x){ if (U->parent[x] != x) { return find_root(U, U->parent[x]); } return x; }
voidmerge(UnionSet *U, int x, int y){ int x_root = find_root(U, x); int y_root = find_root(U, y); if (x_root != y_root) { U->parent[x_root] = y_root; } return ; }
intmain(){ int n, m; scanf("%d%d", &n, &m); UnionSet *U = init(n); // 进行 M 次操作 for (int i = 1; i <= m; i++) { int a, b, c; scanf("%d%d%d", &a, &b, &c); switch(a) { case1: merge(U, b, c); break; // 合并操作 case2: printf("%s\n", find_root(U, b) == find_root(U, c) ? "Yes" : "No"); } } return0; }
// 初始化 voidinitialization(int n, int parent[]){ for (int i = 1; i <= n; i++) { parent[i] = i; } return ; }
// 路径压缩 intfind_root(int x, int parent[]){ if (parent[x] != x) { parent[x] = find_root(parent[x], parent); } return parent[x]; }
// 朴素算法 intfind_root1(int x, int parent[]){ while (parent[x] != x) { x = parent[x]; } return x; }
voidmerge(int x, int y, int parent[]){ int x_root = find_root(x, parent); int y_root = find_root(y, parent); if (x_root != y_root) { parent[x_root] = y_root; } return ; }
intmain(){ int n, m, parent[MAX_N + 10]; cin >> n >> m; initialization(n, parent); for (int i = 0; i < m; i++) { int a, b, c; scanf("%d%d%d", &a, &b, &c); if (a == 1) { // 添加 merge(b, c, parent); } else { // 查看 if (find_root(b, parent) - find_root(c, parent)) { printf("No\n"); } elseprintf("Yes\n"); } } return0; }
// 初始化 voidinitialization(int n, int parent[], int height[]){ for (int i = 1; i <= n; i++) { parent[i] = i; // 开始树高为 0 height[i] = 0; } return ; }
// 路径压缩 intfind_root(int x, int parent[]){ if (parent[x] != x) { parent[x] = find_root(parent[x], parent); } return parent[x]; }
// 朴素算法 intfind_root1(int x, int parent[]){ while (parent[x] != x) { x = parent[x]; } return x; }
voidmerge(int x, int y, int parent[], int height[]){ int x_root = find_root(x, parent); int y_root = find_root(y, parent); if (x_root != y_root) { if (height[x_root] == height[y_root]) { parent[x_root] = y_root; // 相等让y的树高 +1 height[y_root]++; } elseif (height[x_root] > height[y_root]) { parent[y_root] = x_root; } else { parent[x_root] = y_root; } } return ; }
intmain(){ int n, m, parent[MAX_N + 10], height[MAX_N + 10]; cin >> n >> m; initialization(n, parent, height); for (int i = 0; i < m; i++) { int a, b, c; scanf("%d%d%d", &a, &b, &c); if (a == 1) { // 添加 merge(b, c, parent, height); } else { // 查看 if (find_root(b, parent) - find_root(c, parent)) { printf("No\n"); } elseprintf("Yes\n"); } } return0; }
voidinitial(int n){ for (int i = 1; i <= n; i++) { arr[i] = i; } }
intfind(int x){ if (arr[x] != x) { x = find(arr[x]); } return arr[x]; }
voidmerge(int x, int y){ int x_root = find(x); int y_root = find(y); if (x_root != y_root) { arr[x_root] = y_root; } return ; }
intmain(){ int n, m, p; cin >> n >> m >> p; initial(n); while (m--) { int mi, mj; cin >> mi >> mj; merge(mi, mj); } while (p--) { int mi, mj; cin >> mi >> mj; if (find(mi) == find(mj)) { cout << "Yes" << endl; } else { cout << "No" << endl; } } return0; }