並查集專題講解

2021-08-21 15:42:41 字數 1845 閱讀 4864

*並查集是一種樹型的資料結構,用於處理一些不相交集合的合併及查詢問題。

例如:1,合併兩個集合,複雜度是o(1)。

2,查詢乙個元素在哪個集合裡面,複雜度o(1)。

3,查詢兩個元素是否在同乙個集合裡面。

1,初始化:每個結點的父親結點首先設為它本身。

void init()
2,路徑壓縮(解決特殊情況下的樹的層次深而造成的複雜度增大的問題)

int find(int x)
3,合併

void merge(int a,int b)
1,前期未經過路徑壓縮的樹形結構並查集,樹的深度有可能是n。

未經過路徑壓縮的並查集find()函式(獲得父親結點的):

int find(int x)
例如:

2,並查集一定要記得初始化。

3,有些並查集的題目用cin,cout有可能會超時。遇到常數比較大的盡量不要用cin,cout輸入輸出。

1.*看題目請戳這裡poj 1611 the suspects此題是乙個模板題

ac code:

#include

using

namespace

std;

const

int n=3e4+6;

int n,m,k,fa[n],total[n];

int find(int x)

void merge(int a,int b)

int main()

}cout

<0)]<2,看題請戳這裡hdu1232

ac code:

#include

using

namespace

std;

const

int n=1e3+6;

int n,m,ans,fa[n];

int find(int x)

void merge(int a,int b)

int main()

for(int i=1;i<=n;i++)

if(fa[i]==-1)ans++;

cout

<1

<3,模板微變形。poj 1988 堆箱子

題意:給你p個操作,有兩種可能,一是移動操作,移動操作就是把x磚的這一堆放到y磚這一堆的上面。其次是統計操作,統計x磚下面一共有多少磚。

並查集專題

洛谷p3144 usaco16open 關閉農場關閉農場 離線的反著的並查集 看看在不在乙個集合內 include include include include using namespace std int n,m int f 99999 a 3009 3099 b 3999 int ans 1...

並查集講解

所謂並查集,實際上可以認為是對集合的合併與查詢,所以下面從集合開始講解。假設有集合a 1 2 3 4 5,集合b 6 7 8 9 0 假設此時有乙個條件導致a中的隨便乙個數與b中的隨便乙個數在乙個集合內,那麼很顯然ab將會合併成乙個更大的集合。接下來考慮演算法 對乙個陣列f 50 來說,先對其進行初...

並查集講解

什麼是並查集 並查集是一種資料結構,用來快速查詢集合元素之間是否有關係,是否有關係判斷標準是是否有相同的根節點 舉乙個恰當的例子,要判斷圖譜中的兩個元素是否有關係,如果使用常規的查詢方法,時間複雜度比較大,使用並查集就是用來優化這種情況,使得判斷兩個元素是否有關聯可以達到o 1 普通查詢思路 按照上...