union-find算法实现(连通性问题)

package com.snail.basic;

/*

  • 触点-->对象称之为触点

  • 分量-->等价类称为连通分量简称分量

  • 等价关系-->相连称之为等价

  • */
    public class WeightedQuickUnilnUF {
    private int[] id; //父链接数组(由触点索引)
    private int[] sz; //各个根结点所对应分量的大小
    private int count; // 连通分量的数量

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

    public int count() {
    return count;
    }

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

    public int find(int p) {
    while (p != id[p]) {
    p = id[p];
    }
    return p;
    }

    // 加权quick-union的深度最多为logN
    public void union(int p, int q) {
    int i = find(p);
    int j = find(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];
    }
    count--;
    }
    }

你可能感兴趣的:(union-find算法实现(连通性问题))