*並查集是一種樹型的資料結構,用於處理一些不相交集合的合併及查詢問題。
例如:1,合併兩個集合,複雜度是o(1)。
2,查詢乙個元素在哪個集合裡面,複雜度o(1)。
3,查詢兩個元素是否在同乙個集合裡面。
1,初始化:每個結點的父親結點首先設為它本身。
void init()
2,路徑壓縮(解決特殊情況下的樹的層次深而造成的複雜度增大的問題)
int find(int x)
3,合併
void merge(int a,int b)
1,前期未經過路徑壓縮的樹形結構並查集,樹的深度有可能是n。
未經過路徑壓縮的並查集find()函式(獲得父親結點的):
int find(int x)
例如:
2,並查集一定要記得初始化。
3,有些並查集的題目用cin,cout有可能會超時。遇到常數比較大的盡量不要用cin,cout輸入輸出。
1.*看題目請戳這裡poj 1611 the suspects此題是乙個模板題
ac code:
#include
using
namespace
std;
const
int n=3e4+6;
int n,m,k,fa[n],total[n];
int find(int x)
void merge(int a,int b)
int main()
}cout
<0)]<2,看題請戳這裡hdu1232
ac code:
#include
using
namespace
std;
const
int n=1e3+6;
int n,m,ans,fa[n];
int find(int x)
void merge(int a,int b)
int main()
for(int i=1;i<=n;i++)
if(fa[i]==-1)ans++;
cout
<1
<3,模板微變形。poj 1988 堆箱子
題意:給你p個操作,有兩種可能,一是移動操作,移動操作就是把x磚的這一堆放到y磚這一堆的上面。其次是統計操作,統計x磚下面一共有多少磚。
並查集專題
洛谷p3144 usaco16open 關閉農場關閉農場 離線的反著的並查集 看看在不在乙個集合內 include include include include using namespace std int n,m int f 99999 a 3009 3099 b 3999 int ans 1...
並查集講解
所謂並查集,實際上可以認為是對集合的合併與查詢,所以下面從集合開始講解。假設有集合a 1 2 3 4 5,集合b 6 7 8 9 0 假設此時有乙個條件導致a中的隨便乙個數與b中的隨便乙個數在乙個集合內,那麼很顯然ab將會合併成乙個更大的集合。接下來考慮演算法 對乙個陣列f 50 來說,先對其進行初...
並查集講解
什麼是並查集 並查集是一種資料結構,用來快速查詢集合元素之間是否有關係,是否有關係判斷標準是是否有相同的根節點 舉乙個恰當的例子,要判斷圖譜中的兩個元素是否有關係,如果使用常規的查詢方法,時間複雜度比較大,使用並查集就是用來優化這種情況,使得判斷兩個元素是否有關聯可以達到o 1 普通查詢思路 按照上...