Skip to content

介紹

也稱為稱為並查集 • Disjoint-Set 是指能維護n 個物品中,哪些物品是同一種類的 東西的資料結構 • 常見的實作方法是:用一個有根樹來維護同一種類的物品(每個 樹稱為是一個group) 1. 要詢問兩個物品是否同一類時,找到各自的樹根看看是不是同一個東 西即可。(找一個點的樹根的操作被稱為find) 2. 要把兩個物品設為同一類時,也是找到各自的樹根後,把其中一個樹 根指向另一個樹根即可。(此步驟被稱為union)

模板

struct Disjoint_set{
    int d[MAXNUM],num[MAXNUM];
    void array_set(int n){
        for(int i=1;i<=n;i++){
            d[i]=i;
            num[i]=1;
        }
    }
    int find(int n){
        if(n!=d[n]){
            return d[n]=find(d[n]);
        }else{
            return n;
        }
    }
    bool Union(int x,int y){
        x=find(x);
        y=find(y);
        if(x==y)return 0;
        if(num[x]>num[y])swap(x,y);
        num[y]+=num[x];
        d[x]=y;
        return 1;
    }
}DS;