Union Find程式碼塊

Tech In Pieces發表於2020-12-03

如果我們要利用Index
比如說我們想把uf[]陣列變成下面這樣:
{0, 0, 2, 3, 2, 0} 這個意味著node0, node1, node5屬於同一個圖 node2 node 4 屬於另一個圖 node3屬於單獨一個圖

//首先 對uf進行初始化 每個的parent都設為自己
for (int i = 0; i < uf.length; i++) {
            uf[i] = i;
        }
//然後我們把題目給的輸入轉換成一個一個圖(就是union起來)加黑色輸入是一個List<List<Integer>>
for (List<Integer> pair : pairs) {
            union(pair.get(0), pair.get(1));
        }
//當我們之後想要判斷哪些節點屬於同一個圖 就重新遍歷所有的可能節點 利用find()函式找出其root,然後同一個root都聚集在一個List中 這個可以用Hashmap去存,就是說存一個HashMap<Integer, List<Integer>>

//union函式
private void union(int[] uf, int a, int b) { //這兩個節點一定是屬於同一個圖的 
        int aParent = find(a);
        int bParent = find(b);
        if (aParent < bParent) { //往前找root 往前靠 如果a的parent 小一些 就把b的parent重新設為aParent(之前parent[bParent] = bParent)
            uf[bParent] = aParent;
        } else {
            uf[aParent] = bParent;
        }
    }
//find函式
private int find(int[] uf, int x) {
    if (x != uf[x]) {
        uf[x] = find(uf, uf[x]);
    }
    return uf[x];
}

不過為了更直觀的表達 parent[] instead of uf[] would be better.
而且可以把uf[]作為一個全域性變數 這樣就不用每次都要帶上這個引數了

相關文章