定義陣列\(fa[x]\)表示\(x\)的父親
操作之前先要初始化每乙個節點的父親為自己
for(int i = 1; i <= n; i ++) fa[i] = i;
並查集基本操作:查詢,合併
查詢:查詢元素所在集合
int query(int x)
路徑壓縮:
int query(int x)
遞迴版
int query(int x)
合併:合併兩個元素所在集合
void uni(int x, int y)
注意要將集合所代表的元素合併
還有一種按秩合併的方法,就是把小的合併到大的裡面,均攤複雜度是\(log\ n\)
幾道例題
概要:\(n\)個點\(m\)條邊,每個邊有乙個出現的時間\(t\),給定點\(s,t\),問什麼時候這兩個點聯通
題解:按照時間排序,每一次合併兩個集合並查詢點\(s,t\)是否在同一集合內
概要:給定兩個集合\(a,b\)分別有\(n,m\)個元素,\(p,q\)條邊(邊不會聯通a,b),問兩個集合內和一號點聯通的點的個數的最小值(這個要理解一下題意)
題解:裸的並查集,每次合併兩個集合最後乙個點乙個點的查,注意陣列的下標
帶權並查集:在對並查集進行路徑壓縮和合併操作時,這些權值具有一定屬性,即可將他們與父節點的關係,變化為與所在樹的根結點關係。
這題有一種三倍並查集的做法,當然現在講的是帶權並查集(在這裡是簡化了,叫做種類並查集)
用0表示同類,1表示捕食,2表示**食,那麼每次合併的時候就只需要對3取模就行了
分類並查集 並查集的複習
動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示x和y是同類。第二種說法是 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 ...
並查集入門(普通並查集 帶刪除並查集 關係並查集)
什麼是並查集?通俗易懂的並查集詳解 普通並查集 基礎並查集 例題 題解 how many tables problem description lh boy無聊的時候很喜歡數螞蟻,而且,還給每乙隻小螞蟻編號,通過他長期的觀察和記錄,發現編號為i的螞蟻會和編號為j的螞蟻在一起。現在問題來了,他現在只有...