這道題是一道比較好的並查集的題目,蒟蒻頓時感覺我學了乙個假的並查集。
首先,這道題的意思是:
給你 \(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 先說第一種搞法,也是最直觀的。顯然題目的要求就是再說把這個圖刪掉一些邊使之成為二分圖,那麼答案...