利用並查集解決節點互聯問題
阿新 • • 發佈:2020-10-09
節點連通問題一般來說有兩個思路:
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; } }