並查集演算法:並查集,在一些有n個元素的集合應用問題中,我們通常是在開始時讓每個元素構成乙個單元素的集合,然後按一定順序將屬於同一組的元素所在的集合合併,其間要反覆查詢乙個元素在哪個集合中。這一類問題近幾年來反覆出現在資訊學的國際國內賽題中,其特點是看似並不複雜,但資料量極大,若用正常的資料結構來描述的話,往往在空間上過大,計算機無法承受;即使在空間上勉強通過,執行的時間複雜度也極高,根本就不可能在比賽規定的執行時間(1~3秒)內計算出試題需要的結果,只能用並查集來描述。
並查集是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併及查詢問題。常常在使用中以森林來表示。
有兩種主要的演算法,一種是單鏈表實現,另一種是並查集森林實現,下面的是並查集森林的實現。
關鍵點理解:個人感覺主要的理解關鍵點在於對陣列含義的理解,father[i]儲存的數,代表的是編號為i的人的父輩的編號,這樣來不停的查詢這個輩分最大的人,所以這樣說的話,每個集合或者說是家族,最後都會有乙個輩分最大的人,而這個人就會用來區分兩個人或者兩個元素是不是同乙個集合。另外乙個關鍵點則是對路徑壓縮演算法的理解,可以用乙個來幫助理解:
// 合併兩個元素所在的集合
void
union
(int x,
int y)
// 判斷兩個元素是否屬於同乙個集合
bool
same
(int x,
int y)
// 獲取根結點
intgetfather
(int x)
// 獲取根結點,是上邊函式的改進,壓縮了路徑長度
intgetfather
(int x)
並查集模板
來自lifeng wang http hi.baidu.com fandywang jlu 前輩06年寫的東西,追隨前人足跡繼續努力。並查集的一些題目和相關解題報告 poj 1611 the suspects 最基礎的並查集 poj 2524 ubiquitous religions 最基本的並查集...
並查集模板
普通並查集 define max size 100005 int pa max size 儲存有向圖的邊 void init 初始化 該函式可以根據具體情況儲存和初始化需要的內容 int findset int a 不帶路勁壓縮 return a void union nodes int a,int...
並查集模板
codevs 2597 團夥 題目描述 description 1920年的芝加哥,出現了一群強盜。如果兩個強盜遇上了,那麼他們要麼是朋友,要麼是敵人。而且有一點是肯定的,就是 我朋友的朋友是我的朋友 我敵人的敵人也是我的朋友。兩個強盜是同一團夥的條件是當且僅當他們是朋友。現在給你一些關於強盜們的資...