並查集 筆記與思路整理

2022-10-11 08:09:11 字數 1020 閱讀 6444

算是非常基礎的內容了,之前寫到kruskal的時候突然想起還沒整理過。

其實就想存個板子

並查集是一種樹型的資料結構,用於處理一些集合(只能是不交集)。

「感性理解」一下就是把一堆東西分成若干堆,每個東西都在且僅在其中一堆裡。

具體實現的話利用乙個father陣列,指向該元素的父親節點。初始時所有元素的father均為它自己,表示每個元素均各自在自己的集合裡。若兩個元素在同乙個集合中,它們的祖先就為同乙個。

主要是兩個函式:join和find。

先說一下find:

int find(int

x)

很好理解,如果x是自己的父親,它就是自己集合的根節點,否則就逐層查詢到根節點為止(順便路徑壓縮——把集合中的點都直接連在根節點下)。這個函式主要是用來通過看兩個元素的祖先是否一致,判斷兩個元素是否在同乙個集合中。

然後是join:

void join(int x, int

y)

這裡需要想象一下,假如要把兩個很大的集合合併起來,最簡單的操作就是直接把乙個集合的根節點並到另乙個集合下。(至於結構會很混亂嘛……下次find的時候再整理就行了)

**實現:

#include using

namespace

std;

int father[10010

];int find(int

x) void join(int x, int

y)int

main()

intp;

scanf("%d

", &p);

while(p--)

return0;

}

筆記 並查集

不管後面寫了啥,一定要把最重要的寫在前面 總記不住 使用陣列表示並查集 int father n father i 表示元素i的父親結點 初始情況下,每個元素都是單獨的集合,因此其父結點是自己,這在並查集中被稱為reflexive for int i 1 i n i 乙個集合中只有乙個根結點,因此反...

並查集與帶權並查集

1.找點的祖先 fa i i 並查集的快主要在於路徑壓縮。1 遞迴寫法 int find int x 2 非遞迴寫法 int find int x return r 2.合併 合併2者的集合。void merge int x,int y 3.帶權並查集 一般是存下一些2者之間的具體的數量關係或者是統...

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...