並查集詳解 例題合集

2021-09-11 03:41:58 字數 1407 閱讀 1316

擒賊先擒王——解密犯罪團夥:

沒錯,就是他們,為了下層勞動階級的利益開始擾亂朝廷治安了。

雖然他們是一家人,但是這些好漢們分成了許多隊伍分開出動,我們需要做的是確定他們分成了多少個隊伍。

我們先來了解一下並查集:

並查集,並查集是一種樹形結構,又叫「不相交集合」,保持了一組不相交的動態集合,每個集合通過乙個代表來識別,代表即集合中的某個成員,通常選擇根做這個代表。

並查集,並查集是一種樹形結構,又叫「不相交集合」,保持了一組不相交的動態集合,每個集合通過乙個代表來識別,代表即集合中的某個成員,通常選擇根做這個代表。

我們先來簡單的分析思路:

這裡我們需要用到並查集,首先呢,我們 知道一共有多少好漢出馬,先假設每個人自己是一夥,並且自己是首領,那麼共有n隊人馬。

第一步,我們可以申請乙個一維陣列pre,用下標來表示好漢們,用每個陣列中的數來表示這隊人馬的boss是誰。

第二步,我們每次將輸入的兩個好漢,合併到乙個隊伍裡,這裡我們需要用到合併函式mix

void

mix(

int p1,

int p2)

並且我們在其中需要查詢函式find來確定各自的團夥:

int

find

(int root)

這裡的查詢函式有好多版本,不過最簡單的還是這個遞迴的寫法。

然後呢,我們就可以進行多次的操作,每次經過查詢,合併,查詢合併,查詢合併…

最後得到人馬的總數。

完整**:

#include

int pre[

1001];

intfind

(int root)

//查詢

intmain()

}for

(i=1

;i<=n;i++

)printf

("%d "

,pre[i]);

printf

("%d"

,total)

;return0;

}

看圖即可,這個過程就好理解的多了,就是查詢,合併的過程,但是理解歸理解,理解也不一定能寫出來,**還需要不斷的磨礪。

例題:1、洛谷:純模板題:

2、pid331 / 家族 :

3、pid600 / [noip2010]關押罪犯 :

4、hdu 1232 暢通工程 :

5、how many tables :

並查集例題

題目描述 假如已知有n個人和m對好友關係 存於集合r 如果兩個人是直接或間接的好友 好友的好友的好友 則認為他們屬於同乙個朋友圈。請寫程式求出這n個人裡一共有多少個朋友圈。輸入 輸入包含多個測試用例,每個測試用例的第一行包含兩個正整數 n m,1 n,m 100000。接下來有m行,每行分別輸入兩個...

並查集例題

找出根節點,如果只有乙個節點,根節點是自己 作迴圈,如果父節點不是自己,一直迴圈 public int find int x return x public void union int x,int y parent rootx rooty count 並查集自己的理解 剛開始每個節點都是看作單獨的...

並查集的例題

題意為 已知學校有n個學生 想知道有多少個宗教,但是不能乙個乙個問學生 已知兩個一起的是乙個宗教的,現可以問m對學生,請求出最多有多少個宗教 輸入資料 10 4 2 3 4 5 4 8 5 8 答案為7 由題知採用並查集求解 可看做二叉樹 include using namespace std co...