並查集 P1525 關押罪犯

2022-09-09 18:00:26 字數 994 閱讀 8505

題意:有n個罪犯,給出m個三元組(a,b,w)表示罪犯a和b有仇恨關係,仇恨度為w,如果a和b關在同乙個監獄就會爆發衝突。將所有罪犯劃分到兩個監獄,使最大的衝突最小,求出這個最小值。

題解:如果第a和b是敵人,那麼ab的敵人就是 朋友,可以被劃分到同一集合。

按邊權從大到小列舉,即優先把衝突大的分到兩個集合中,直到a和b已經在同一集合中,輸出此時的邊權。

上述演算法非常直觀,正確性卻不是很顯然。

考慮如果最終答案是wi,那麼大於wi的邊權必然連線不同的集合,因此答案是滿足單調性的。

code:

1 #include2

#define ll long long

3using

namespace

std;45

struct

edgee[1000006

];8 ll n,m,fa[1000006],enemy[1000006];9

10bool cmp(edge a,edge b)

11int find(ll x)

12int uni(ll x,ll y)

13bool check(ll x,ll y)

1415

intmain()

2122 sort(e+1,e+1+m,cmp);

2324

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

30if(!enemy[x]) enemy[x]=y;

31else

uni(enemy[x],y);

32if(!enemy[y]) enemy[y]=x;

33else

uni(enemy[y],x);34}

35 printf("0"

); 36 }

view code

P1525 關押罪犯 並查集

評測記錄 有n個罪犯,罪犯有些關係,就是 i j,c i,j,c 表示罪犯i和罪犯j在同乙個監獄會造成c的破壞,有兩座監獄,要求分配的使得最大的破壞最小。先按照c排序,然後就從大到小處理直到無法處理。我們可以用並查集表示在乙個監獄中,然後用敵人的敵人是朋友來合併。記錄每個罪犯的敵人的根,然後每次合併...

並查集 P1525 關押罪犯

s城現有兩座監獄,一共關押著n名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為 c 的罪犯被關押在同一監獄,他們...

並查集 P1525 關押罪犯

s城現有兩座監獄,一共關押著n名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為 c 的罪犯被關押在同一監獄,他們...