Disjoint-set algorithm (Union find)

Reference: "algorithm" Fourth Edition, p136 - p144

To leetcode, 200th: Number of Islands ( ) , for example ( https://leetcode.com/problems/number-of-islands/

package com.odyssey.app.algorithm.base;

/**
 * 并查集算法 - 以lc200,number of islands 为例
 *
 * @author Dingsheng Huang
 * @date 2020/3/29 16:15
 */
class UnionFind {
    /**
     * 连通分量,计数
     */
    private int count;

    /**
     * 连通分量,标识
     */
    private int[] id;


    private void init(char[][] grid, int m, int n) {
        for (int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if (grid[i][j] == '1') {
                    count++;
                }
            }
        }
        id = new int[m * n];
        for (int i = 0; i < m * n; i++) {
            id[i] = i;
        }
    }

    // 根节点一定是自旋的,即 p = id[p]
    private int find(int p) {
        while (p != id[p]) {
            p = id[p];
        }
        return p;
    }

    private void union(int p, int q) {
        int pRoot = find(p);
        int qRoot = find(q);
        if (pRoot == qRoot) {
            return;
        }
        id[pRoot] = qRoot;
        count--;
    }

    private boolean isConnected(int p, int q) {
        int pRoot = find(p);
        int qRoot = find(q);
        return pRoot == qRoot;
    }
}

 

He published 195 original articles · won praise 26 · views 40000 +

Guess you like

Origin blog.csdn.net/huangdingsheng/article/details/105181672