並查集 洛谷P1111修復公路

2021-10-01 06:24:49 字數 2065 閱讀 5404

這道題的演算法很直觀,對於兩個村莊之間的連線性,直接用並查集進行處理就可以。處理時要先將修路時間進行排序,然後按時間順序將相連的村莊並在同一集合裡面。

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

1005

;const

int maxm=

100005

;int pa[maxn]

,r[maxn]

;int n,m;

struct edge};

bool

cmp(edge x,edge y)

typedef vector ve;

ve a;

intfindy

(int x)

boolpd(

int x,

int y)

void

uni(

int x,

int y)

}bool

finished()

return

true;}

intmain()

sort

(a.begin()

,a.end()

,cmp)

;for

(int i=

0;iif(failed) cout<

<

return0;

}

finish函式可以更改一下,可以提前設定好乙個陣列size用來在樹根處儲存樹的大小。合併時維護size陣列,對於每次finished函式的查詢,可以查詢1對應的樹根上儲存的size,如果其為n則說明所有點都在乙個樹裡面了。**如下:

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

1005

;const

int maxm=

100005

;int pa[maxn]

,r[maxn]

;int size[maxn]

;int n,m;

struct edge};

bool

cmp(edge x,edge y)

typedef vector ve;

ve a;

intfindy

(int x)

boolpd(

int x,

int y)

void

uni(

int x,

int y)

}bool

finished()

intmain()

for(

int i=

0;i)sort

(a.begin()

,a.end()

,cmp)

;for

(int i=

0;iif(failed) cout<

<

return0;

}

前後兩種**的執行對比:

前一種:

後一種:

洛谷p1111 修復公路

一開始村莊之間兩兩不連通,按時間從小到大修復公路,判斷兩個村莊是否聯通,若聯通了那就直接看下一條路,若不聯通那就修復。直到m條路都遍歷完。重點來了,最早什麼時候任意兩條村莊都存在至少一條修復完成的道路 可以由多條公路連成一條道路 滿足條件最少需要幾條路?n個村莊就n 1條唄,輸出時判斷公路數有沒有至...

洛谷P1111 修復公路

做完題看了一下題解,發現大佬們用的都是什麼最小生成樹,蒟蒻瑟瑟發抖,其實這題用最簡單的並查集就可以通過 對於時間進行排序,從最早完成的時間開始,每次合併兩條邊,然後檢視他們是否屬於同一集合,如果是,輸出完成時間,直接結束程式 如果遍歷結束還沒用都處於同一聯通塊,那麼就輸出 1.不開o2記得卡常 附 ...

洛谷P1111 修復公路

最近並查集有點上癮,下午來道黃題提神醒腦 p1111 修復公路 試題描述 a地區在 過後,連線所有村莊的公路都造成了損壞而無法通車。派人修復這些公路。給出a地區的村莊數n,和公路數m,公路是雙向的。並告訴你每條公路的連著哪兩個村莊,並告訴你什麼時候能修完這條公路。問最早什麼時候任意兩個村莊能夠通車,...