並查集的理解

2022-08-05 10:48:11 字數 852 閱讀 1628

從數學的角度來說,假設我們有n個集合,,.......},而每個集合內又有眾多的元素,等等,每個集合的元素都存在這或多或少的聯絡,什麼聯絡不清楚,但我們只需知道存在這樣的關係即可;而突然,我們希望讓集合之間也聯絡起來,而又不想乙個乙個的將它們綁到一起,那麼,並查集就是解決它們之間聯絡的資料結構。樹就是我們需要用到的一種連線結構。

並查集一般包含三個主體:

1. makeset();建立乙個陣列並儲存每乙個數的節點(可以看成他們所處在的隊伍的編號);

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

per[i] = i;

2.find(int  x);查詢x的根節點,也就是x所隊伍的代表人(代表人特徵 :find(n)=n);

int find(int

p)

return

p;

}

3.unionset(int x,int y) :將兩個關聯的點連線起來;

void union(int a,int

b)

在這裡,我們考慮下per[ax] = b,為甚麼一定是這樣的,而不是per[bx] = a呢?是不是很奇怪;其實無論哪種都沒有錯,都可以將兩者聯絡;但我們思考一下,如果總是固定的乙個新增方法,如果出現子樹遠遠大於根數,那麼連線起來的情況就會很離奇。樹的路徑就會變得很大,因此我們自然會想到,那就把小的連線到大的不就好了;而find()方法的效率取決於樹的路徑大小,那麼我們不就又提高了**的效率了嗎?

void unionset(int p, int

q)

else

count--;

}

並查集理解

作用 連通分量的查詢與合併 理解 1.將連通分量看成乙個集合,該集合包含了連通分量的所有點。連同方式無關緊要,只有屬於和不屬於與這個集合的區別。2.每個集合都可看成一棵樹,這個集合的標誌 這棵樹的標誌 就是這棵樹的根。3.如果把節點x的父親節點儲存在pre x 中,那麼再從pre x 找它的父親節點...

並查集理解

學了這麼久的資料結構了,還是有好些演算法並沒弄清楚,搞得有些筆試題都是沒有思路,今天就講講並查集。感覺這東西吧,就是分圈子,乙個人自成乙個圈子,若分屬於兩個不同圈子的人在某時刻成了好朋友,那這兩個圈子就合併成了乙個圈子,最終在題目中形成多個圈子進行分析。判斷兩個人是不是乙個圈子要不停的找朋友驗證,這...

並查集的理解

並查集的模板,不理解也要背下來 include 萬能標頭檔案 using namespace std int par 100000 ran 10000 個數與深度 int n,m void init int n 初始化 當不需要返回值的時候,函式的型別標void。其實這個也是會返回乙個值,好像是呼叫...