關押罪犯題解

2021-08-21 03:18:38 字數 1043 閱讀 2839

題目

s城現有兩座監獄,一共關押著n名罪犯,編號分別為1~n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用「怨 氣值」(乙個正整數值)來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為 c 的罪犯被關押在同一監獄,他們倆之間會發生摩擦,並造成影響力為c的衝突事件。每年年末,警察局會將本年內監獄中的所有衝突事件按影響力從大到小排成乙個列表,然後上報到s城z市長那裡。公務繁忙的z市長只會去看列表中的第乙個事件的影響力, 如果影響很壞,他就會考慮撤換警察局長。在詳細考察了n名罪犯間的矛盾關係後,警察局長覺得壓力巨大。他準備將罪犯們在兩座監獄內重新分配,以求產生的衝突事件影響力都較小,從而保住自己的烏紗帽。假設只要處於同一監獄內的某兩個罪犯間有仇恨,那麼他們一定會在每年的某個時候發生摩擦。那麼,應如何分配罪犯,才能使z市長看到的那個衝突事件的影響力最小?這個最小值是多少?

分析

這道題一般是拿並查集做,但也可用二分圖做,因為要求影響力最小值,所以滿足單調性,故可以用二分做,先設出l,r,mid,根據mid進行處理,若影響值>mid,則將兩個罪犯之間連邊,最終得到一張無向圖,若這個無向圖是乙個二分圖,則令r=mid,否則l=mid+1,直到l=r,此時可求出答案。

上**(時間148ms)

#include

using

namespace

std;

int flag,l=-1,r=1

<<30,mid,n,m,al[100001],bl[100001],next[200001],head[200001],ver[200001],tot,cl[100001],dl[200001];

void add(int x,int y)

void dfs(int a)

if(dl[x]==-1) dl[x]=1^dl[a],dfs(x);

}}int main()

if(flag) r=mid;

else l=mid;

}cout

0;}

noip2010 關押罪犯 題解

這道題的初始思路肯定會往貪心上面靠吧。很明顯首先需要對所有的衝突值從大到小排乙個序,因為是從小到大處理,所以肯定是衝突的放在兩個不同的監獄裡,一直到不得不衝突的為止。主要問題在於 不能直接通過標記罪犯所在的監獄編號來記錄衝突!因為你不能確定把當前罪犯放在監獄1裡或者監獄2裡,與後面的罪犯衝突的情況下...

題解 P1525 關押罪犯

這道題是一道比較好的並查集的題目,蒟蒻頓時感覺我學了乙個假的並查集。首先,這道題的意思是 給你 n 個點,將他們任意分成兩邊,求這些點之前權值最大的邊盡量的小,求這個值。我們如何用並查集來做呢?首先,我們將所有邊從大到小排序,對於每兩個點 x 和 y 我們將 x 和 y 的敵人放一起,x 的敵人和 ...

tyvj P1403 關押罪犯 題解

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