這裡有一篇十分精彩、生動的 並查集詳解 ***;
disjoint set,並查集(一種集合),也叫不相交集,同時也是一種樹型的資料結構;用於處理一些不相交集合(disjoint sets)的合併(merge)及查詢(find)問題。常常在使用中以森林來表示。集就是讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組的元素所在的集合合併。
並查集的構成:
兩個函式構成
路徑壓縮的概念可通過下圖清晰地展示出來,
路徑壓縮之後,減少了中間的傳遞過程,一步直達根節點(總代表);
但需要注意的是,執行一次 find,只把乙個分支,統一化為兩層結構;
int find(int x)
return r;
}
查並集Disjoint Set(不相交的集合)
wa了好多次 常見兩種操作 1 合併兩個集合 2 查詢某個元素屬於哪個集合 實現方法一 常用 每個集合用一棵 有根樹 表示 1 定義陣列set 1,n 2 set i i 則 i 表示本集合,並使集合對應樹的根 3 set i j 若 j 不等於 i 則 j 是 i 的父節點 舉個例子 具體操作 1...
並查集 並查集
本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...
分類並查集 並查集的複習
動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示x和y是同類。第二種說法是 2 ...