C 並查集 通過一道例項說明

2021-08-09 04:48:35 字數 1579 閱讀 2638

並查集在對待某一類問題時十分有效。

能夠方便解決聯通性的問題。

通過一道題目例項說明:

小y到島上淘金,湖中共有n個小島,每個小島上都有若干個金幣

島與島之間有橋連線,一共有m座橋,小y不會游泳,所以他只能通過橋訪問其他的小島

但是小y為了淘金,找萬能的魔法師小l要來了兩顆傳送卷軸,傳送卷軸可以讓他移動到另外乙個小島(無論是否之間是否有橋相連)

1號島是大陸,小y起初站在1號島上,小y訪問完小島之後會回到1號島,畢竟他不想流落荒島變成野人

小y最多可以獲得多少個金幣 輸入

n mw1 w2 ... wn

a1 b1

a2 b2

...am bm

上面w1到wn表示每座島有多少個金幣

接下來m對數字

每對數字表示哪兩個島之間有一座橋

注意橋是雙向的,並且可能兩座島之間會有多座橋

橋可以無限次重複走 輸出

最多的金幣數目

樣例輸入

5 41 1 3 4 10

1 22 1

3 44 3

樣例輸出 12

提示 直觀解決的思路非常簡單:

連起來的島都歸到一塊

跟1號島相連的島的金幣加上 除此外連線起來的島的金幣 之和即為最終答案

10為傳送到達

問題的核心在於如何快速的將這些島分到一塊。

即點的聯通問題。

來看具體實現

//pre用於存其上乙個連線的地方,pre[i] == i則代表為根節點

//w與此題相關

int pre[1000],w[1000],root[1000]=;

//查詢函式,查詢它的根結點

//連線操作

//將所有多並行連線改到乙個根結點連線

//因為在使用join查詢時有可能會出現上面一張所示並非單層相連的場景。

//可以通過判別pre[i] 是否等於i判別該點是否為根結點

//最終在一塊的都會加到同一方位root中

//後面與該題相關

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

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

cout<

合根植物 (一道並查集模板題)

藍橋杯b組試題 w星球的乙個種植園,被分成 m n 個小格仔 東西方向m行,南北方向n列 每個格仔裡種了一株合根植物。這種植物有個特點,它的根可能會沿著南北或東西方向伸展,從而與另乙個格仔的植物合成為一體。如果我們告訴你哪些小格仔間出現了連根現象,你能說出這個園中一共有多少株合根植物嗎?public...

C 並查集親戚 Relations 演算法例項

題目 親戚 relations 或許你並不知道,你的某個朋友是你的親戚。他可能是你的曾祖父的外公的女婿的外甥的表姐的孫子。如果能得到完整的家譜,判斷兩個人是否親戚應該是可行的,但如果兩個人的最近公共祖先與他們相隔好幾代,使得家譜十分龐大,那麼檢驗親戚關係實非人力所能及.在這種情況下,最好的幫手就是計...

資料結構 由小公尺的一道面試題入手並查集

3 這種方法可解但是我們仔細想想,時間複雜度是很高的,實現起來也是很麻煩的,因此我們想想有沒有一種新的方法可以降低時間複雜度,很好的進行實現的,於是就出現了一種新的資料結構 並查集。include include using namespace std class unionfindset 查詢當前...