並查集詳解

2021-10-02 11:25:30 字數 1776 閱讀 6133

1.合併:合併兩個集合。

2查詢:判斷兩個元素是否在乙個集合。

int father[n]

;

其中father[ i ]表示元素 i 的父親結點。

如果father[ i ] = i ;表示元素 i 是該集合的根結點。

對陣列進行初始化

for

(int i=

1; i<=n ;i++

)

查詢:

查詢的操作就是對給定的結點尋找其根節點的過程。實現的方式可以是遞推或者遞迴

<1>遞推

int

findfather

(int x)

return x;

}

<2>遞迴:

int

findfather

(int x)

合併

把兩個集合合併成為乙個集合

void

union

(int a,

int b)

}

對於上面的操作我們還可以優化

在找根節點的時候把其路徑上所有結點的父親結點都指向其根節點

這樣的話查詢的時候就不用一直回溯去找父親結點了

查詢的複雜度也可以降低到o(1)。

優化後**如下(遞迴):

int

findfarher

(int v)

}

其實在合併的過程中我們也可以進行優化

在合併時候我們肯定希望樹的深度小一些好

我們可以用乙個rank陣列來記錄它的深度

記得還要將rank陣列初始化為0

並查集詳解

其實並查集顧名思義就是有 合併集合 和 查詢集合 兩種操作的關於資料結構的一種演算法。並查集演算法不支援分割乙個集合。用集合中的某個元素來代表這個集合,該元素稱為集合的代表元。乙個集合內的所有元素組織成以代表元為根的樹形結構。對於每乙個元素 parent x 指向x在樹形結構上的父親節點。如果x是根...

詳解並查集

並查集主要用來求解不相交集合的問題,主要針對於合併和查詢兩種演算法。並查集的實現主要包含了三個部分 並查集的初始化是對單個資料建立了乙個單獨的集合,每個集合應該包含以下兩個資料 由以上兩個資料,一般的並查集的結構一般有兩種表示形式 結構體構造如下 define max 50 struct node ...

並查集詳解

看大佬的形象解釋 並查集 按我現在對這個的理解 就是給你一堆數,然後給你兩個兩個數的關係,然後關係的傳遞性 連帶性 這些數就都有了關係 有關係的數組成乙個陣列,然後輸出這個一維陣列,裡面有幾個沒關係的陣列 應該怎麼做呢?第一種解釋是 每給兩個數就把乙個數當成祖宗,把另乙個數當成孩子,然後給了孩子和另...