題解 P1525 關押罪犯

2022-04-30 14:54:09 字數 1014 閱讀 5743

這道題是一道比較好的並查集的題目,蒟蒻頓時感覺我學了乙個假的並查集。

首先,這道題的意思是:

給你 \(n\) 個點,將他們任意分成兩邊,求這些點之前權值最大的邊盡量的小,求這個值。

我們如何用並查集來做呢?

首先,我們將所有邊從大到小排序,對於每兩個點 \(x\) 和 \(y\) ,我們將 \(x\) 和 \(y\) 的敵人放一起, \(x\)的敵人和 \(y\) 放一起,敵人的敵人就是我的朋友。

當兩個點不得不連線在一起時,那麼我們就輸出這條邊的邊權,特別的,如果沒有兩個點被迫連在一起,那麼就需要輸出 \(0\)

為什麼這樣做是對的呢?

首先,我們的邊權是從大到小排的,當第一次出現兩個不得不連線在一起的點時,當前這條邊的邊權肯定是最大的。

那麼,對於第 \(i\) 個點的敵人 \(b[i]\) ,它與 \(i\) 的連邊肯定是最大的,那麼對於 \(x\) 和 \(y\) ,\(x\) 連上 \(y\) 的敵人肯定要比 \(x\) 和 \(y\) 連邊的權值要小,不然的話,我們就會先遍歷到這條邊,再遍歷 \(x\) 和 \(y\) 的這條邊。

\(code:\)

#include #include #include #define n 100011

using namespace std;

struct node

a[n];

int f[n],b[n];

bool cmp(node x,node y)

int getf(int v)

void merge(int x,int y)

bool check(int x,int y)

int main()

if(!b[x])

b[x]=y;

else

merge(b[x],y);

if(!b[y])

b[y]=x;

else

merge(b[y],x);

} return 0;

}

P1525 關押罪犯

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

P1525 關押罪犯

題目鏈結 在看了演算法高階指南的二分圖後,就對著方面的題躍躍欲試。這道題目,大佬已經把思路講的很清楚 有題目中明顯的提示 把罪犯分成兩個監獄,在同乙個監獄的罪犯之間的怨氣值要盡 可能小。那麼二分答案判定的東西就出來了。即在同乙個監獄裡的罪犯之間最大怨氣值 但是這個東西有什麼用處呢?1降低時間複雜度,...

P 1525 關押罪犯

1.題目鏈結。這和bzoj 1370是乙個東西 映象並查集。假設a n和a的敵人,把a n這個人叫做a的映象,同理b n是b的映象。然後對於給定的關係x,y連邊,邊權就是怒氣值,然後成了乙個無向帶權圖。1 先說第一種搞法,也是最直觀的。顯然題目的要求就是再說把這個圖刪掉一些邊使之成為二分圖,那麼答案...