資料結構:速通並查集

天启A發表於2024-09-27

並查集用來幹什麼:處理不相交的集合的合併以及查詢相交集合的個數等情況

例題(自行搜尋):360 24年第一批筆試演算法題傳染病防控

並查集具有三個操作init find union

init

初始化集合,將當前所有節點的父節點設定為自己

int fa[]=new int[10000];
int size[]=new int[10000];//這裡是為了記錄當前節點有多少子節點,假設自己也運算元節點
void init(int n){
    for(int i=0;i<n;i++){
        fa[n]=i;size[i]=1;
} }

find

找到該節點的父節點

int find(int n){
    if(fa[n]==n){//說明當前節點的父節點就是自己
          return n;
    }    
    else{
          fa[n]=find(fa[n]);//遞迴找到當前節點的最大父節點
          return fa[n];
    }
}

union

將節點合在一起,讓他們形成一個集合,由fa[n]表示當前節點的父節點是誰

void union(int x,int y){
    int fa_x=find(x);
    int fa_y=find(y);
    if(fa_x==fa_y)//說明他們本來就是一個父節點,不需要處理
        return;
    fa[x]=y;//他們是兩個集合,那麼這裡就需要將他們並在一起。這裡取y作為父節點  
size[y]+=size[x];//x已經成為了y的子節點,那麼x的所有子節點也應該加入到y中
}

相關文章