並查集(又加找父親 hh)
並查集是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併及查詢問題。常常在使用中以森林來表示。集就是讓每個元素構成乙個單元素的集合,並就是按一定順序將屬於同一組的元素所在的集合合併。
並查集的基本操作:
1.初始化,使每個節點的祖宗節點為自己。
2.將兩個集合合併成乙個集合。
3.查詢兩個元素是否在乙個集合。
最關鍵的就是find函式:
int find(intx)
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 #include4using
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的螞蟻在一起。現在問題來了,他現在只有...