並查集用來管理元素分組情況的資料結構。
1.初始化集合。陣列fa記錄每個節點的父節點編號,初始時各元素單獨形成乙個集合,fa[x]=x,x是所在樹的根。另設rank陣列記錄根節點的秩,可以是樹高度,也可以是集合內元素個數。
void init(int n)
//非遞迴方法
int find(int x)
return r;
}
3.合併集合。先找出x,y各自所屬集合的根節點,若不屬於乙個集合則進行合併,將乙個組的根連向另乙個組的根。可採用啟發式合併的優化:根據根節點rank記錄的秩,將rank小的根向rank大的根連邊。
void unite(int x,int y)
}
判斷是否屬於同一集合:
bool same(int x,int y)
並查集平均複雜度為o(α(n))。 並查集操作
並查集可以簡單的看作是對集合的 合併和查詢 每乙個元素都唯一屬於乙個集合,每乙個集合都有唯一的乙個根元素,來唯一標識這個集合。如何儲存元素?可以用陣列來儲存元素,陣列下標代表該元素,陣列的值代表該元素的父元素。例如father a b。就代表a元素的父元素是b。如何表示根元素?規定一下,只要fath...
並查集 並查集的刪除操作
描述 一天小 w 給學弟們上課,小 w 說 注意了,並查集只適合於加的操作,不太方便處理減的操作喲。j 老師聽了後,呵呵了一下。她課後找到小 w 說,其實並查集也可以做減的操作的。只看你如何靈活運用了。比如這個題 給你 n 個元素,最開始時分屬於 n 個集合,有如下三種操作 小 w 陷入了無盡的思考...
並查集 並查集
本文參考了 挑戰程式設計競賽 和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 ...