並查集總結

2022-05-27 16:57:13 字數 945 閱讀 2827

並查集是一種樹型的資料結構,用於處理一些不相交集合(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 的合併及查詢問題。常常在使用中以森林來表示。集就是讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組...