並查集及其應用

2021-04-28 01:58:37 字數 2700 閱讀 1293

並查集:(union-find sets)是一種簡單的用途廣泛的集合. 並查集是若干個不相交集合,能夠實現較快的合併和判斷元素所在集合的操作,應用很多,如其求無向圖的連通分量個數、最小公共祖先、帶限制的作業排序,還有最完美的應用:實現kruskar演算法求最小生成樹。其實,這一部分《演算法導論》講的很精煉。

一般採取樹形結構來儲存並查集,在合併操作時可以利用樹的節點數(加權規則)或者利用乙個rank陣列來儲存集合的深度下界--啟發式函式,在查詢操作時進行路徑壓縮使後續的查詢操作加速。這樣優化實現的並查集,空間複雜度為o(n),建立乙個集合的時間複雜度為o(1),n次合併m查詢的時間複雜度為o(m alpha(n)),這裡alpha是ackerman函式的某個反函式,在很大的範圍內這個函式的值可以看成是不大於4的,所以並查集的操作可以看作是線性的。

它支援以下三種操作:

-union (root1, root2) //合併操作;把子集合root2和子集合root1合併.要求:root1和 root2互不相交,否則不執行操作.

-find (x) //搜尋操作;搜尋元素x所在的集合,並返回該集合的名字--根節點.

-ufsets (s) //建構函式。將並查集中s個元素初始化為s個只有乙個單元素的子集合.

-對於並查集來說,每個集合用一棵樹表示。

-集合中每個元素的元素名分別存放在樹的結點中,此外,樹的每乙個結點還有乙個指向其雙親結點的指標。  

-為簡化討論,忽略實際的集合名,僅用表示集合的樹的根來標識集合。

以下給出我的兩種實現:

//abstract: ufset

//author:lifeng wang

(fandywang)

// model one

與model 2 路徑壓縮方式不同,合併標準不同

const

int maxsize = 500010;

intrank[maxsize];

// 節點高度的上界

intparent[maxsize];

// 根節點

intfindset(int x)

void

union(int root1, int root2) }

void

initi(void)

// model two

const

int maxsize = 30001;

intpre[maxsize]; //

根節點i,pre[i] = -num,其中num是該樹的節點數目; //

非根節點j,pre[j] = k,其中k是j的父節點

intfind(int x)

return x; }

void

union(int r1, int r2)

else }

void

initi(void)

並查集的一些題目和我的相關解題報告:

poj 1611 the suspects

最基礎的並查集

poj 2524 ubiquitous religions

最基本的並查集

poj 1182 食物鏈

並查集的拓展

注意: 只有一組資料;

要充分利用題意所給條件:有三類動物a,b,c,這三類動物的食物鏈

構成了有趣的環形。a吃b, b吃c,c吃a。也就是說:只有三個group

poj 2492 a bug's life

並查集的拓展

法一:深度優先遍歷

每次遍歷記錄下該點是男還是女,只有:男-〉女,女-〉男滿足,否則,找到同性戀,結束程式。

法二:二分圖匹配

法三:並查集的拓展:和1182很像,只不過這裡就有兩組,而1182是三組,1611無限制

poj 1861 network == zju_1542

並查集+自定義排序+貪心求"最小生成樹"

答案不唯一,不過在zoj上用qsort()和sort()都能過,在poj上只有sort()才能過...

poj 1703 find them, catch them 並查集的拓展

這個和poj 2492 a bug's life

很像,就是把**稍微修改了一下就ac了!

注意:and of course, at least one of them belongs to gang dragon, and the same for gang snake. 就是說只有兩個組。

poj 2236 wireless network

並查集的應用

需要注意的地方:1、並查集;2、n的範圍,可以等於1001;3、從n+1行開始,第乙個輸入的可以是字串。

poj 1988 cube stacking

並查集很好的應用

1、與 銀河英雄傳說==noi2002 galaxy一樣;2、增加了乙個陣列behind[x],記錄戰艦x在列中的相對位置;3、詳細解題報告見銀河英雄傳說。

joj 1905 freckles

== poj 2560 最小生成樹

法一:prim演算法;法二:並查集實現kruskar演算法求最小生成樹

joj 1966

super market iii == pku 1456

supermarket 帶限制的作業排序問題(貪心+並查集)

提高題目:

poj 2912 rochambeau

poj 1733 parity game   

poj 1308 is it a tree?

並查集及其應用

並查集 union find sets 是一種簡單的用途廣泛的集合.並查集是若干個不相交集合,能夠實現較快的合併和判斷元素所在集合的操作,應用很多,如其求無向圖的連通分量個數 最小公共祖先 帶限制的作業排序,還有最完美的應用 實現kruskar演算法求最小生成樹。其實,這一部分 演算法導論 講的很精...

並查集及其應用

並查集的學習告一段落,整理總結一下與大家共勉 並查集 union find sets 是一種簡單的用途廣泛的集合.並查集是若干個不相交集合,能夠實現較快的合併和判斷元素所在集合的操作,應用很多,如其求無向圖的連通分量個數 最小公共祖先 帶限制的作業排序,還有最完美的應用 實現kruskar演算法求最...

模版 並查集(及其加權)

並查集是經典的圖論演算法,用來維護點與集合的關係,也簡潔明瞭。給定 n nn 個點,有 m mm 次操作,每次操作輸入 pppa aab bb 若 p 1 p 1 p 1 則 合併 aaab bb 若 p 2 p 2 p 2 則 查詢 aaab bb 是否同屬乙個集合 並查集初始化 每個父親點 都 ...