並查集是一種用來管理元素分組情況的資料結構:
查詢元素a和b是否屬於同乙個組
合併元素a和元素b所在的組
有兩種路徑壓縮:
1.對於每個節點,一旦向上走到了一次根節點,就將其直接連向根
2.不僅僅是查詢的節點,在查詢過程中所有經過的結點,都改為直接連到根上
基本結構:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const
double n =
1e6+10;
const
double pi =
acos(-
1.0)
;const
int inf =
0x3f3f3f3f
;const
int mod =
1000000007
;#define ll long long
#define cl(a,b) memset(a,b,sizeof(a))
#define maxn 100010
int a[maxn]
;int par[maxn]
;int ran[maxn]
;void
init
(int n)
}int
find
(int x)
}void
unite
(int x ,
int y)
}int
main()
int res =0;
for(
int i =
1; i <= n ; i++
) cout << res-
1<< endl;
return0;
}
上述**的功能是:n表示n個節點,m表示m條邊,接下來m行是邊的兩個節點。問最少再加幾條邊可以變成任意兩點之間有路。 並查集知識
其實並查集顧名思義就是有 合併集合 和 查詢集合 兩種操作的關於資料結構的一種演算法。並查集演算法不支援分割乙個集合。用集合中的某個元素來代表這個集合,該元素稱為集合的代表元。乙個集合內的所有元素組織成以代表元為根的樹形結構。對於每乙個元素 parent x 指向x在樹形結構上的父親節點。如果x是根...
並查集 並查集的基本操作總結
並查集的定義 並 union 合併 查 find 查詢 集 set 查詢 並查集的實現 int father n 使用乙個陣列記錄 father 1 1 1的父節點是本身 father 2 1 2的父節點是1 並查集的初始化 for int i 1 i n i 並查集的查詢 int findfath...
並查集知識總結
1.非路徑壓縮 遞迴版 int64 findroot int64 x 非遞迴版 int64 findroot int64 x 查詢x的根節點 2.帶路徑壓縮 遞迴版 int64 findroot int64 x 找x的根節點 非遞迴版 int64 findroot int64 x return r ...