解決動態連通性 並查集

2022-08-21 08:51:12 字數 2446 閱讀 7618

先貼乙個大佬的文章,解釋有趣簡單,非常適合新人~

大佬tql

不過這個原帖的閱讀量還沒有幾個**的高……唉

什麼是並查集?並查集是一種樹型的資料結構,用於處理一些不相交集合的合併及查詢問題。常常在使用中以森林來表示。在實際解決問題的過程中並查集的應用廣泛,但主要還是用來判斷兩點是否聯通,以及尋找乙個節點的祖先。

下面我們通過乙個例子來簡單了解一下並查集。

houge,hiang,revolver是ujn的三名大一新生。其中,houge和hiang在計1801班,班長是宋同學,班主任是曲老師;revolver在計1802班,班長是張同學,班主任是王老師,我們就可以據此得到乙個關係圖

現在我們想找一下houge和revolverz的最大的上級:首先houge的直接上級是宋同學,宋同學的上級是曲老師;revolverz的直接上級是張同學,張同學的上級是王老師。這樣一來,我們的任務就完成了。但是我們每次想要找乙個同學最大的上級的時候都需要經過中間人,這樣太麻煩了,我們不如把每個同學的直接上級都改為他的最大上級,這樣就方便了許多。

改完之後我們發現houge,hiang和revolverz雖然在乙個隊伍裡,卻不在乙個班級裡,好在大二分流之後重新分班,要把計1802的同學全部加入到計1801裡。我們把計1802班級裡的所有人的上級,都改為曲老師,這樣r神就和我們乙個班了!但是有什麼用呢?他已經退役了。

我們還會發現王老師的上級竟然變成了曲老師,沒辦法,誰讓計1802班合併了呢 xd

上面這個過程就簡單實現了並查集的三個操作:查詢、路徑壓縮和合併。

下面我們試著用**來實現上面的過程。

一、查詢

首先我們需要乙個陣列pre來記錄當前結點的父結點,如該結點沒有父結點,我們讓pre[this]等於它本身。如對於上面的例子,我們可以賦值:pre[1]=pre[2]=4,pre[4]=6,pre[6]=6,pre[3]=5,pre[5]=7,pre[7]=7。

若要查詢乙個結點的根結點,我們要查詢它的父結點,在查詢父結點的父結點……直到乙個結點的父結點就是他本身為止(pre[i]=i),**如下:

1

int union_find(intx)2

8return

r;9 }

同時我們也可以查詢兩個不同的結點是否在同乙個通路裡面,只需要判斷一下兩個結點的根結點是否相同即可,這一步的**與合併一起在下面給出。

二、路徑壓縮

雖然查詢操作的耗時不算大,但是當你的乙個結點和它的根結點之間有很多的中間結點,而且查詢的次數非常多的時候,就可能會耗費非常多的時間。那麼我們可以在每一次的查詢過程中,都進行路徑壓縮,把乙個結點的父結點直接改為根結點,來達到防止浪費時間的目的。

1

int union_find(intx)2

8int i=x,j;

9while(pre[i]!=r) //

路徑壓縮

1015

return

r;16 }

三、合併對於兩個在不同通路的結點,若想把它們合併為乙個通路,只需要把乙個結點設為另乙個點的父結點即可(無特殊需要,沒有順序要求)。

1

void join(int a,intb)2

這樣我們就把並查集的基本功能都實現了,下面來看一些題目。

四、相關應用及題目

1.例題 luogu p3367【模板】並查集

**:

1 #include 2

3using

namespace

std;45

int pre[10005];6

7int union_find(intx)8

14int i=x,j;

15while(pre[i]!=r)

1621

return

r;22}23

24void join(int a,int

b)25

3132

intmain()

3350}51

return0;

52 }

luogu p3367

2.最小生成樹——kruskal

在kruskal中我們利用並查集來判斷目前所選邊的兩點是否已經連通。

五、其他題目

author : houge  date : 2019.6.4

update log : 

並查集,動態連通性

n,m n個點,m條邊 隨之而來m條邊 q 代表q個操作 q行,每行乙個序號,代表將第m個輸入的邊刪除,問刪除後有多少個連通塊。思路 我們將m條邊,和q詢問記錄下來,並將要刪除的邊標記。然後對那些不用的邊使用並查集,並算出有多少個連通塊。然後從最後乙個詢問開始,依次將那些邊加入並查集,如果加入時,兩...

並查集 解決連通性問題

給的輸入形式不同,但都是利用並查集,並查集的實現是不變的。1 323.無向圖中連通分量的數目 給定編號從 0 到 n 1 的 n 個節點和乙個無向邊列表 每條邊都是一對節點 請編寫乙個函式來計算無向圖中連通分量的數目。2 547.省份數量 連通分量的數目 有 n 個城市,其中一些彼此相連,另一些沒有...

動態連通性

問題 一對整數p,q可以理解為 p與q是相連的 問給出一組整數對p,q,判斷p,q是否相連,如果相連,則忽略,不想連則新增連線。如 a b c d 則此時認為abcd互相連線。如果新增另一組整數對a,c 則新增不成功,因為此時a,c已經連通 若新增另一組整數對a,f。則新增成功,此時a,b,c,d,...