並查集的實現(c ,利用map)

2021-09-12 23:39:35 字數 789 閱讀 1585

並查集(union-find)是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併查詢問題。 並查集存在兩個操作(1.union 聯合 2.finddeputy 查詢代表結點) 和乙個需要解答的問題( issameset 是否 在乙個集合中,或者說是否有同乙個代表結點)。

利用map實現主要通過兩個map的物件 ,乙個map型別的fathermap,關鍵字為子結點,值為其父結點(父結點不一定就是代表結點),當我們需要查詢兩個兩個元素是否在乙個集合中時,只需一直向上找(函式finddupty),在找的過程中,會壓縮路徑,把沿途經過的結點直接掛在其代表結點下,看是否有共同的代表結點;

乙個map型別的sizemap,key為結點,value為其子結點的個數(這個個數只對代表結點有效,子結點無效),主要用處是在合併(union)時將子結點較少的代表結點掛在子結點代表較多的代表結點下,且sizemap中父結點對應的value要加上子結點較少的代表的結點個數。

**如下:

#include#include#includeusing namespace std;

templateclass unionfindset

}//尋找代表結點,且路徑壓縮

data findduputy(data node)

fathermap[node]=father;

return father;

}  

void union(data a ,data b)

;

家譜 並查集 map

題目描述 給出充足的父子關係,請你編寫程式找到某個人的最早的祖先。輸入格式 輸入由多行組成,首先是一系列有關父子關係的描述,其中每一組父子關係中父親只有一行,兒子可能有若干行,用 name 的形式描寫一組父子關係中的父親的名字,用 name 的形式描寫一組父子關係中的兒子的名字 接下來用 name ...

C 實現並查集

將n個不同的元素分成一組不相交的集合。開始時,每個元素就是乙個集合,然後按規律將兩個集合進行合併。假如已知有n個人和m對好友關係 存於陣列r 如果兩個人是直接的或間接的好友關係 好友的好友的好友.則認為他們屬於同一好友圈,請求出這n個人中有幾個好友圈。例如 n 5,m 3,r 表示有5個人,1和2是...

並查集實現(c )

1.何為並查集?並查集是一種樹型的資料結構,用於處理一些不相交集合的合併及查詢問題,簡單的說就是對集合操作的一種資料結構。2.做什麼用 考慮這樣乙個問題 若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。規定 x和y是親戚,y和z是...