並查集

並查集作用:
1.判斷兩節點是否聯通
2.連接兩個節點,使之聯通

並查集數據結構:
多路樹結構
例:
這裏寫圖片描述
存儲結構:
數組模擬:設數組爲pre[i]
i爲當前節點,pre[i]則爲i節點所指向的父節點

那麼判斷兩個節點是否聯通就可以判斷兩節點的最終指向的父節點是否一樣。

聯通兩個並查集,也變得很簡單,兩個並查集的最終父節點肯定是不同的,那麼連接兩個並查集就可以只要將其中一個並查集的最終父節點指向另一個並查集的父節點。

最終代碼如下:

package 並查集;

import java.util.Scanner;

public class Main {

    public static final  int NUMBER = 1000;

    //pre代表,此下標 i 的父節點下標爲 pre[i]
    static int pre[] = new int[NUMBER+5];

    //初始化父節點爲自己本身
    public static void initPre(){

        for(int i=0;i<=NUMBER;++i)
            pre[i]=i;
    }

    //找出最大父節點,並更新節點
    public static int findSet(int x){
        int p = x;
        while(pre[p]!=p) p=pre[p];
        //此時找出的p就是x的最大父節點

        int r;
        //更新x的父節點
        while(x!=p){
            r = pre[x];
            pre[x] = p;
            x = r;
        }

        return p;
    }

    //判斷是否是在一個並查集上
    public static boolean isSameSet(int x,int y){

        int fx = findSet(x);
        int fy = findSet(y);
        return fx==fy ? true:false;
    }

    //連接兩個並查集
    public static void unionSet(int x,int y){

        int fx = findSet(x);
        int fy = findSet(y);
        //連接兩個並查集
        if(fx!=fy){
            pre[fy]=fx;
        }
    }


    public static void main(String[] args) {

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章