並查集理解

2021-10-23 20:54:39 字數 919 閱讀 2991

學了這麼久的資料結構了,還是有好些演算法並沒弄清楚,搞得有些筆試題都是沒有思路,今天就講講並查集。

感覺這東西吧,就是分圈子,乙個人自成乙個圈子,若分屬於兩個不同圈子的人在某時刻成了好朋友,那這兩個圈子就合併成了乙個圈子,最終在題目中形成多個圈子進行分析。

判斷兩個人是不是乙個圈子要不停的找朋友驗證,這就很麻煩,乙個圈子總要有個大boss吧,所以最好直接在合併圈子的時候直接從屬於乙個乙個老大,後面就查詢兩個人的老大是不是乙個就知道是否處於同一圈子。

可以看看這篇文章,講的挺好的。

學習演算法,就是要多刷題嘛,我覺得這個朋友圈就很經典,可以很快上手並查集演算法。當然,根據場景可更換資料結構進行並查集演算法的實現,比如hashmap.

下面是我自己在朋友圈這題中寫的**

class

solution

int n = m.length;

friend=

newint

[n];

// 初始化,每個人自成乙個圈子

for(

int i =

0;i < n;i++

)for

(int i =

0;i < n;i++)}

}// 查詢有多少個圈子,根據老大來判斷有多少圈子,只有老大的老大是自己

for(

int i =

0;i < n;i++)}

return res;

}// 查

intfind

(int x)

// 將自己的上級改為圈子老大

friend[x]

= boss;

return boss;

}// 並

void

union

(int x,

int y)

}}

並查集理解

作用 連通分量的查詢與合併 理解 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。其實這個也是會返回乙個值,好像是呼叫...

並查集的理解

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