並查集是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併及查詢問題。常常在使用中以森林來表示。
集合定義方法: 「代表元法」,即每個集合選擇乙個固定的元素,作為整個集合的「代表」。
merge —— 把兩個集合合併成乙個大集合
**示例:
——並查集的 奇技淫巧
①路徑壓縮
get時, 將訪問過的節點直接指向樹根。 均攤複雜度
**示例:
int find(int x)
按秩合併
「秩」:樹的深度(未路徑壓縮) / 集合大小 。均攤複雜度
將」秩「記錄在 「代表元素」 , 合併時, 將「秩」較小的樹根 作為 「秩」較大的樹根的子節點。
**示例:
void unionn(int x, int y)}}
注:①同時採用 「路徑壓縮」 和 「按秩合併」 優化的並查集, 每次get操作複雜度可進一步降低到。
即為反阿克曼函式
②如果題目需要維護明確的父子關係而用到了按秩合併的話,是不能用路徑壓縮的。一旦用了路徑壓縮,會破壞樹的形態,原來的節點會直接壓縮到祖先上,這樣一來我們呼叫的時候父子關係發生了改變,造成了演算法的錯誤。
③並查集能在一張無向圖中維護節點之間的連通性(實際上可以維護許多具有傳遞性的關係)。
④並查集能夠快速跳過無用集合
普通並查集:
p1955 [noi2015]程式自動分析
uva1316 supermarket
邊帶權並查集:
p1196 [noi2002]銀河英雄傳說
poj 1733 parity game
擴充套件域並查集:
p2024 [noi2001]食物鏈
poj 1733 parity game
並查集 總結
自己學完後總結一下吧,並查集,我的理解就是乙個查詢與合併,用乙個find函式來查詢自己的祖先也就是根節點,在這過程中還可以進行路徑壓縮,就是讓這個點直接變到根節點之下,還有就是合併,找出這兩個點的根節點,如果根節點不相同的話,就將乙個根節點放到另乙個根節點下面。這道題的就是用並查集做,找出總共有幾個...
並查集總結
用自己的理解來寫好了 有些地方可能不對 不定時更新理解 操作主要為三步 一 初始化 void init 二 查詢 這個為路徑壓縮 就是每次查詢時更新 查詢節點 x 上面所有節點直接使他們連向根節點 每次查詢更新 int find int x 另一種路徑壓縮 不過麻煩了些 作為理解 int find ...
並查集總結
注 此博文是在老師上課之後總結的,屬於課堂筆記,大部分摘自老師提供的課件。並查集總結總結兩點就是 並 和 查 並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。集就是讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組...