並查集模板

2021-06-16 20:19:44 字數 803 閱讀 4129

普通並查集:

#define max_size 100005  

int pa[max_size]; //儲存有向圖的邊

void init() //初始化 該函式可以根據具體情況儲存和初始化需要的內容

} int findset(int a) //不帶路勁壓縮

return a;

} void union_nodes(int a, int b) //集合合併

}

帶路徑壓縮的的findset函式:

1.while版本

int findset(int v)      //找元素所在集合的代表元(因為用了路徑壓縮,路徑壓縮的主要目的是為了盡快的確定元素所在的集合)  

return v;

}

2.遞迴版本

int findset(int x)  

else

}

個人經驗表明在遞迴版本不棧溢位的情況下,遞迴版本和迴圈版本的效率並沒有太大差別,並且對於帶路徑壓縮的並查集,基本上不會發生「遞迴棧溢位」。

另外,union_nodes函式還可以可以採用啟發式合併,思路就是把深度較小的那棵子樹並到深度較大的那棵子樹上,不過一般情況下路徑壓縮就夠用了。

聽人說並查集還可以「離散化」,個人從字面上理解應該是指用map、hash來儲存每個節點,從而當節點分布比較稀疏的時候,可以比普通並查集更快的完成初始化等工作(待商榷)。

並查集模板

來自lifeng wang http hi.baidu.com fandywang jlu 前輩06年寫的東西,追隨前人足跡繼續努力。並查集的一些題目和相關解題報告 poj 1611 the suspects 最基礎的並查集 poj 2524 ubiquitous religions 最基本的並查集...

並查集模板

codevs 2597 團夥 題目描述 description 1920年的芝加哥,出現了一群強盜。如果兩個強盜遇上了,那麼他們要麼是朋友,要麼是敵人。而且有一點是肯定的,就是 我朋友的朋友是我的朋友 我敵人的敵人也是我的朋友。兩個強盜是同一團夥的條件是當且僅當他們是朋友。現在給你一些關於強盜們的資...

並查集模板

2 17 演算法筆記 並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。其擁有如下特點 1,資料的聯通具有無向性,也就是說在合併子集和時,無向圖也只有一步 2 在最小生成樹中,可以根據並查集來判斷連通性而通過最小生成樹 頂點數...