並查集演算法筆記

2021-09-23 05:45:50 字數 2854 閱讀 2390

並查集是一種用來管理元素分組情況的資料結構,並查集可以高效的進行如下操作

使用樹狀結構來實現

在樹形資料結構中,如果發生了退化的情況,複雜度就會變得很高。在並查集中,可以按照如下方法避免退化:

};並查集複雜度平均下來每次查詢和合併的複雜度都是常數的(阿克曼函式)。

leetcode 547. friend circles

題目描述

班上有n名學生。他們中的一些人是朋友,而有些則不是。他們的友誼本質上是傳遞性的。例如,如果a是b的直接朋友,而b是c的直接朋友,那麼a是c的間接朋友。我們定義的朋友圈是一群直接或間接的朋友。

給定n * n矩陣m表示班級中學生之間的朋友關係。如果m [i] [j] = 1,那麼第i和第j個學生是彼此的直接朋友,否則不是。而且你必須在所有學生中輸出朋友圈的總數。

樣例

輸入:

[[1,1,0],

[1,1,0],

[0,0,1]]

輸出:2

學生0和學生1是直接朋友,所以他們倆是乙個朋友圈,學生2跟自己是朋友,所以有兩個朋友圈

**
class

unionfind

}int

find

(int n)

void

union

(int a,

int b)};

class

solution}}

int res =0;

for(

int i =

0; i < n; i++

)return res;}}

;

leetcode 200. number of islands

題目描述

給定包含『1』(陸地)和『0』(水)的2維網格圖,計算島嶼數量。島被水包圍,通過水平或垂直連線相鄰的土地而形成。你可以假設網格的所有四個邊都被水包圍。

樣例

輸入:

11110

11010

11000

00000

輸出: 1

解釋:可以看到島嶼可以全部連成一塊,所以最後是1個島嶼

輸入:11000

11000

00100

00011

輸出: 3

解釋:可以看到左上角有一片島嶼,中間有一片島嶼,右下角有一片島嶼,所以最後是3個島嶼

**
class

unionfind

}int

find

(int n)

void

union

(int a,

int b)};

class

solution,,

,};int

encode

(int i,

int j,

int n)

intnumislands

(vector

char

>>

& grid)}}

}}int res =0;

for(

int i =

0; i < m; i++)}

}return res;}}

;

leetcode 684. redundant connection

題目描述

在這個問題中,樹是乙個連線的無向圖,沒有環。

給定輸入是以具有n個節點(具有不同值1,2,…,n)的樹開始的圖,其中新增了乙個附加邊。新增的邊有兩個不同的頂點,從1到n中選擇,並且不是已經存在的邊。

得到的圖形作為2d邊緣陣列給出。邊的每個元素是一對[u,v],其中u 返回可以刪除的邊,以便生成的圖是n個節點的樹。如果有多個答案,則返回給定2d陣列中最後出現的答案。答案邊[u,v]應採用相同的格式,u 樣例

輸入:[[

1,2]

,[2,

3],[

3,4]

,[1,

4],[

1,5]

]輸出:[1

,4]說明: 給出的例子的圖長這樣,加上了[1,

4]邊以後就出現了1-2

-3-4的環,所以1

-4邊是冗餘的,所以是答案5-

1-2|

|4-3

**
class

unionfind

}int

find

(int n)

bool

union

(int a,

int b)};

class

solution

}return res;}}

;

前面概述部分來自於並查集

後面模板**部分來自於並查集模板

演算法筆記 並查集

專題 並查集 一 引入 在一些有n個元素的集合應用問題中,我們通常是在開始時讓每個元素構成乙個單元素的集合,然後按一定順序將屬於同一組的元素所在的集合合併,其間要反覆查詢乙個元素在哪哪個集合中。該問題看似並不複雜,但資料量極大,若用正常的資料結構來描述的話,往往超過了空間的限制,計算機無法承受 而且...

演算法筆記 並查集

先給出源 和輸入輸出測試結果 includeusing namespace std const int n 110 int father n 存放父親節點 bool isboot n 標記時否為根節點 int findfather int x return x void union int a,in...

《演算法筆記》9 6 並查集

一.定義 實現 int father n father i j 表示 j 的父親結點是 i father i i 表示元素 i 是該集合的根結點 二.基本操作 1.初始化 for int i 1 i n i father i i 2.查詢 非遞迴實現 int findfather int x 遞迴實...