並查集的基本使用

2021-09-20 10:32:53 字數 1048 閱讀 5756

並查集用於快速的分類和查詢,處理一些不相交集合的合併與查詢

基本的操作:

1.初始化,把每個值對應的集合都設為自己

2.合併,把乙個集合合併到另乙個上

3.查詢,本部落格採用路徑壓縮演算法實現查詢的操作,查詢元素在集合中對應的集合位數

/* 

基本的操作:

1.初始化,把每個值對應的集合都設為自己

2.合併,把乙個集合合併到另乙個上

3.查詢,本部落格採用路徑壓縮演算法實現查詢的操作,查詢元素在集合中對應的集合位數

*/#include using namespace std;

#define max 1000000

int parent[max]; //定義乙個parent陣列,parent[i]表示i元素所對應的集合為parent[i]

int find( int p ) //路徑壓縮的find演算法

int main()

int m;

cin >> m;

for (int i = 1; i <= m; i++)

return 0;

}

複雜度:n次合併m查詢的時間複雜度為o(m alpha(n)),這裡的alpha(n)可以視為不超過4的數,所以可以視並查集的操作為有係數的線性時間。

並查集的啟發式合併:

由於路徑壓縮改變了樹的結構,所以在可撤銷並查集和可持久化並查集時就不大好用了。所以採用啟發式合併有時就會有優勢。

並查集的啟發式合併就是在兩個集合合併的時候,將siz小的連向siz大的。複雜度為o(nlogn)。

主要的複雜度在於找到根節點。我們考慮一次合併,將siz小的連向大的,這時候只有siz小的那棵子樹在以後的查詢中多跑一次(因為祖先節點多了乙個),我們考慮乙個節點最深在**,那就是不斷的作為siz小的那一部分合併,那這時候每次深度加1,總大小至少翻倍,所以最深log層。

並查集 並查集的基本操作總結

並查集的定義 並 union 合併 查 find 查詢 集 set 查詢 並查集的實現 int father n 使用乙個陣列記錄 father 1 1 1的父節點是本身 father 2 1 2的父節點是1 並查集的初始化 for int i 1 i n i 並查集的查詢 int findfath...

並查集 並查集

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

POJ The Suspects 基本的並查集

沒什麼好說的,並查集的基本操作,都在注釋裡了 include include include define maxn 30005 using namespace std int parent maxn int rank maxn 並查集的秩,根據題意,這裡選用樹的結點數。void makeset i...