並查集是一種用來管理元素分組情況的資料結構,並查集可以高效的進行如下操作
使用樹狀結構來實現
在樹形資料結構中,如果發生了退化的情況,複雜度就會變得很高。在並查集中,可以按照如下方法避免退化:
};並查集複雜度平均下來每次查詢和合併的複雜度都是常數的(阿克曼函式)。
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 遞迴實...