樸素並查集

2022-07-18 04:45:18 字數 950 閱讀 9885

並查集(又加找父親 hh)

並查集是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併及查詢問題。常常在使用中以森林來表示。集就是讓每個元素構成乙個單元素的集合,並就是按一定順序將屬於同一組的元素所在的集合合併。

並查集的基本操作:

1.初始化,使每個節點的祖宗節點為自己。

2.將兩個集合合併成乙個集合。

3.查詢兩個元素是否在乙個集合。

最關鍵的就是find函式:

int find(int

x)

find函式是用來尋找每個節點的祖宗節點是哪個 以當前的節點的集合開始尋找,如果自身不是祖宗節點,則詢問父親節點,直到尋找到祖宗節點並且回溯將每個節點全部連線到祖宗節點,即使祖宗節點成為其父親節點。

一共有n個數,編號是1~n,最開始每個數各自在乙個集合中。

現在要進行m個操作,操作共有兩種:

「m a b」,將編號為a和b的兩個數所在的集合合併,如果兩個數已經在同乙個集合中,則忽略這個操作;

「q a b」,詢問編號為a和b的兩個數是否在同乙個集合中;

輸入格式

第一行輸入整數n和m。

接下來m行,每行包含乙個操作指令,指令為「m a b」或「q a b」中的一種。

輸出格式

對於每個詢問指令」q a b」,都要輸出乙個結果,如果a和b在同一集合內,則輸出「yes」,否則輸出「no」。

每個結果佔一行。

上**:

1 #include2 #include3 #include4

using

namespace

std;

5int

a,b;

6int f[100010];7

int find(intx)8

12int

main()

1329

}30 }

樸素並查集

1 樸素並查集 模板 並查集 模板題 acwing 836.合併集合 int p n 儲存每個點的祖宗節點 返回x的祖宗節點 int find int x 初始化,假定節點編號是1 n for int i 1 i n i p i i 合併a和b所在的兩個集合 p find a find b acwi...

並查集 並查集

本文參考了 挑戰程式設計競賽 和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 ...

並查集入門(普通並查集 帶刪除並查集 關係並查集)

什麼是並查集?通俗易懂的並查集詳解 普通並查集 基礎並查集 例題 題解 how many tables problem description lh boy無聊的時候很喜歡數螞蟻,而且,還給每乙隻小螞蟻編號,通過他長期的觀察和記錄,發現編號為i的螞蟻會和編號為j的螞蟻在一起。現在問題來了,他現在只有...