並查集理解

2021-08-11 07:22:20 字數 1106 閱讀 2669

作用

連通分量的查詢與合併

理解

1.將連通分量看成乙個集合,該集合包含了連通分量的所有點。連同方式無關緊要,只有屬於和不屬於與這個集合的區別。

2.每個集合都可看成一棵樹,這個集合的標誌(這棵樹的標誌)就是這棵樹的根。

3.如果把節點x的父親節點儲存在pre[x]中,那麼再從pre[x]找它的父親節點pre[pre[x]],一直向上找就可以找到這棵樹的根。就是這棵樹的標記,當x沒有父親節點(x就是樹的根)那麼pre[x] = x。

下圖為查詢和合併兩個操作

另外還有路徑壓縮

路徑壓縮就是將樹中子節點的父親節點變成根(連通分量標誌)

這樣做的的好處是便於找到連通分量標誌 如圖

附上兩個操作**

查詢

int find(int x)

int find(int x)

return r;

}

合併

void union(int x,int y)

}

遞迴寫法(用於帶權並查集時實用)

int pre[maxn];

int find(int i)

int a,b;

void merge(int i, int j)

{ a = find(i);

b = find(j);

if(a == b)

return;

pre[a] = b;

並查集理解

學了這麼久的資料結構了,還是有好些演算法並沒弄清楚,搞得有些筆試題都是沒有思路,今天就講講並查集。感覺這東西吧,就是分圈子,乙個人自成乙個圈子,若分屬於兩個不同圈子的人在某時刻成了好朋友,那這兩個圈子就合併成了乙個圈子,最終在題目中形成多個圈子進行分析。判斷兩個人是不是乙個圈子要不停的找朋友驗證,這...

並查集的理解

並查集的模板,不理解也要背下來 include 萬能標頭檔案 using namespace std int par 100000 ran 10000 個數與深度 int n,m void init int n 初始化 當不需要返回值的時候,函式的型別標void。其實這個也是會返回乙個值,好像是呼叫...

並查集的理解

從數學的角度來說,假設我們有n個集合,而每個集合內又有眾多的元素,等等,每個集合的元素都存在這或多或少的聯絡,什麼聯絡不清楚,但我們只需知道存在這樣的關係即可 而突然,我們希望讓集合之間也聯絡起來,而又不想乙個乙個的將它們綁到一起,那麼,並查集就是解決它們之間聯絡的資料結構。樹就是我們需要用到的一種...