1. 程式人生 > 實用技巧 >利用並查集解決節點互聯問題

利用並查集解決節點互聯問題

節點連通問題一般來說有兩個思路:
1、化作圖論問題,是否連通變為深度/廣度優先搜尋,連通個數為連通分量
2、構造並查集解決
兩者程式碼複雜度差不多但並查集時間複雜度更低

class UnionFind {
        private int[] id;

        public UnionFind(int N) {
            id = new int[N];
            for (int i = 0; i < N; i++) {
                id[i] = i;  //初始化
            }
        }

        void put(int origin, int target) {
            //遞迴到父節點再進行連通合併
            while (id[origin] != origin) {
                origin = id[origin];
            }
            while (id[target] != target) {
                target = id[target];
            }
            id[origin] = target;
        }

        //遞迴獲取並比對父節點
        boolean connected(int origin, int target) {
            while (id[origin] != origin) {
                origin = id[origin];
            }
            while (id[target] != target) {
                target = id[target];
            }
            return origin == target;
        }

        //獲取父節點數 
        public int getConnectionNum() {
            int r = 0;
            for (int i = 0; i < id.length; i++) {
                if (id[i] == i) r++;
            }
            return r;
        }
    }