package com.example.suanfa.alg1;/**并查集使用 * @author lfy * @date 2022-05-28 */public class BingChaCollection { int[] fa,rank; public void init(int n){ for (int i = 0; i < n; i++) { fa[i] = i; rank[i] = 1; } } public int find(int x){ if (fa[x] == x){ return x; }else { return find(fa[x]); } //return fa[x] == x ? x : find(fa[x]); } //树根据秩(节点的子树深度)进行合并,浅子树合并到深子树 public void merge(int i, int j) { int x = find(i), y = find(j); if (rank[x] <= rank[y]){ fa[x] = y;} else{ fa[y] = x;} if (rank[x] == rank[y] && x != y){ rank[y]++;} } //亲戚问题,两个人的根节点只要在一个集合中,就说明有亲戚问题 public static void main(String[] args) { //分别表示有n个人,m个亲戚关系,询问p对亲戚关系。 int n=0, m=0, p=0, x=0, y=0; BingChaCollection test = new BingChaCollection(); test.init(n); for (int i = 0; i < m; ++i) { //scanf("%d%d", &x, &y); test.merge(x, y); } for (int i = 0; i < p; ++i) { //scanf("%d%d", &x, &y); System.out.println(test.find(x) == test.find(y) ? "Yes" : "No"); } }}