並查集專題總結

2022-08-04 08:15:10 字數 1691 閱讀 2709

並查集是乙個高效的資料結構,最簡單的作用是用來判斷圖中的兩個點是不是屬於同乙個連通分量。

我們可以將圖中的每乙個連通分量看成乙個集合,每個集合都有乙個特徵值。比如的特徵值為1,那麼記f[1] = f[2] = f[3] = f[4] = 1,則這樣可以通過判定兩個點的f值來判定是不是屬於同乙個連通分量。

然後,我們用樹的形式來記錄集合,並且這個樹只需要包含集合中的所有點即可,而不需要在意樹的具體形式。而這個集合的特徵值,則為根節點的節點編號。這樣的話,如果該樹是條長長的鏈,則每次求葉子節點的f值時都需要幾乎遍歷所有節點,這樣的話時間複雜度就會很高。所以,我們每次求了乙個點的f值都將該節點的父親設定為樹的根節點(即改變樹的形狀)。

下面是find函式:

1

//find返回節點x的父親節點

2int find(intx)3

view code

下面是merge函式:

1

//將不屬於同乙個連通分量的兩點x,y所在的連通分量合併

2void merge(int x, inty)3

view code

題目訓練:

1、poj 1861 network

水題,裸的最小生成樹的kruskal演算法改一下。題解poj 1861 network。

2、poj 2524 ubiquitous religions和poj 1611 the suspects

兩道水題,算是並查集入門題吧。

3、poj 1703 find them, catch them

並查集的基礎題,很多難題都是以這種思路為來做的。感覺這道題完全弄懂以後,就算是會並查集了。題解poj 1703 find them, catch them。

4、poj 1182 食物鏈

並查集的基礎題,是上一道題(poj 1703)的加強版。算是很經典的題了。題解poj 1182 食物鏈。

5、la 3644

巧妙之處在與建圖,(至少對於我這種圖論小白來說),圖建好了就是以羅並查集。題解la 3644 x-plosives。

6、poj 1456 supermarket

貪心+並查集優化。很好的並查集使用方法,還有srm 473 div1 500pt,就是數學+並查集。並查集的使用方法和此處一樣。題解poj 1456 supermarket。

7、poj 1733 parity game

類似食物鏈那個題。題解poj 1733 parity game。

8、hdu 3038 how many answers are wrong

類似食物鏈那題。題解hdu 3038 how many answers are wrong。

9、poj 1417 true liars

並查集+dp。並查集的部分類似於食物鏈,後面的dp部分也很明顯。總的來說思維難度比以上題略大,編碼複雜度比較高。poj 1417 true liars

10、poj 2912 rochambeau

並查集的使用方法和食物鏈那題很像,但是還新增了其他東西,思維難度和編碼複雜度均比較大。poj 2912 rochambeau

11、zoj 3261 connections in galaxy war

很巧妙的處理方法。如果不說是並查集的題應該會很難聯想到並查集。就算聯想到了,也是想出來這題的覺得很簡單,沒想出來的覺得很難。巧。zoj 3261 connections in galaxy war

並查集專題

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

並查集專題講解

並查集是一種樹型的資料結構,用於處理一些不相交集合的合併及查詢問題。例如 1,合併兩個集合,複雜度是o 1 2,查詢乙個元素在哪個集合裡面,複雜度o 1 3,查詢兩個元素是否在同乙個集合裡面。1,初始化 每個結點的父親結點首先設為它本身。void init 2,路徑壓縮 解決特殊情況下的樹的層次深而...

並查集 總結

自己學完後總結一下吧,並查集,我的理解就是乙個查詢與合併,用乙個find函式來查詢自己的祖先也就是根節點,在這過程中還可以進行路徑壓縮,就是讓這個點直接變到根節點之下,還有就是合併,找出這兩個點的根節點,如果根節點不相同的話,就將乙個根節點放到另乙個根節點下面。這道題的就是用並查集做,找出總共有幾個...