並查集(disjoint-set)是一種可以動態維護若干個不重疊的集合,並支援合併與查詢兩種操作的一種資料結構。
init():初始化
union(int x,int y):合併兩個元素
findfather(int x):v找元素的所屬集合
我們建立乙個陣列father表示乙個並查集,father[i]表示i的父節點。
初始化:每乙個點都是乙個集合,因此自己的父節點就是自己father[i]=i
查詢:每乙個節點不斷尋找自己的父節點,若此時自己的父節點就是自己,那麼該點為集合的根結點,返回該點。
修改:合併兩個集合只需要合併兩個集合的根結點,即father[faa]=fab,其中faa,fab是兩個元素的根結點。
int
findfather
(int root)
return root;
}void
union
(int a,
int b)
void
init()
1013 battle over cities (25分)
1021 deepest root (25分)
1034 head of a gang (30分)dfs+並查集
1107 social clusters (30分)
1118 birds in forest (25分)
最後 不得不推薦並查集的一篇好博文:並查集詳解(超級簡單有趣~~就學會了)並查集的非常好的博文,原來的作者寫實在太好了!
pat甲級1107 並查集
並查集在findfather 函式中進行壓縮路徑,陷阱是這裡只壓縮該結點以上到根的路徑,其以下的路徑不壓縮,這裡不搞清楚會有三個測試點過不去 include include include using namespace std int n vector int hobby 1001 int fat...
浙大PAT甲級 1107 並查集
這個題目求有共同愛好的人的集體數,以及從大到小輸出各個集體的人數。並查集的思想。我的思路是 用num i 陣列表示根為愛好i的人數個數。最後排序統計不等於的num i 有多少個,然後排序,後序輸出。ac include include include include include include ...
PAT甲級1004題解 並查集思想改
題目分析 本題開始一直在考慮如何將每乙個節點通過一種合適的資料結構儲存起來 一對多的關係 最後發現借助並查集的思想可以用乙個陣列p,p i 存放i節點的父節點,每次查詢編號為i的節點屬於第幾層且判斷是否有以該點位父元素的節點 判斷該點是否為葉子節點,是則floor 對應層數 由於本題的圖不存在環路,...