并查集模板

public class UF {
     
    private int[] id;
    private int[] sz;

    public UF(int N) {
     
        id = new int[N];
        sz = new int[N];
        for (int i = 0; i < N; i++) {
     
            id[i] = i;
            sz[i] = 1;
        }
    }

    // 路径压缩
    public int root(int i) {
     
        while (i != id[i]) {
     
            id[i] = id[id[i]];
            i = id[i];
        }
        return i;
    }

    public boolean connected(int p, int q) {
     
        return root(p) == root(q);
    }

    // 带权
    public void union(int p, int q) {
     
        int i = root(p);
        int j = root(q);
        if (i == j)
            return;
        if (sz[i] < sz[j]) {
     
            id[i] = j;
            sz[j] += sz[i];
        } else {
     
            id[j] = i;
            sz[i] += sz[j];
        }
    }
}

你可能感兴趣的:(算法)