並查集用來幹什麼:處理不相交的集合的合併以及查詢相交集合的個數等情況
例題(自行搜尋):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中
}