NOIP2010關押罪犯

2021-07-03 14:58:38 字數 1519 閱讀 3451

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

每年年末,警察局會將本年內監獄中的所有衝突事件按影響力從大到小排成乙個列表,然後上報到s城z市長那裡。公務繁忙的z市長只會去看列表中的第乙個事件的影響力,如果影響很壞,他就會考慮撤換警察局長。

在詳細考察了n 名罪犯間的矛盾關係後,警察局長覺得壓力巨大。他準備將罪犯們在兩座監獄內重新分配,以求產生的衝突事件影響力都較小,從而保住自己的烏紗帽。假設只要處於同一監獄內的某兩個罪犯間有仇恨,那麼他們一定會在每年的某個時候發生摩擦。那麼,應如何分配罪犯,才能使z 市長看到的那個衝突事件的影響力最小?這個最小值是多少?

【輸入輸出樣例說明】罪犯之間的怨氣值如下面左圖所示,右圖所示為罪犯的分配方法,市長看到的衝突事件影響力是3512(由2號和3號罪犯引發)。其他任何分法都不會比這個分法更優。

【資料範圍】n≤ 20000,m≤ 100000。

【輸入格式】輸入檔案的每行中兩個數之間用乙個空格隔開。第一行為兩個正整數n 和m,分別表示罪犯的數目以及存在仇恨的罪犯對數。接下來的m 行每行為三個正整數aj,bj,cj,表示aj 號和bj 號罪犯之間存在仇恨,其怨氣值為cj。資料保證1

【分析】這道題的方法有很多,我是直接從邏輯關係入手,當然還有二分圖。關鍵在於找出給出條件中矛盾的地方,我們假設所有給出的罪犯之間有矛盾,於是將其不放在同組,必然存在不能劃分的狀態,我們要讓這個值最小,所以先將所有條件按矛盾值排序,然後逐個處理。考慮到監獄只有兩個,產生了如下情況,若a與b不同組a與c不同組,那麼bc不可同組,如果後面遇到了bc的條件,直接出結果。

乙個演算法顯現出來。我們從最高矛盾值到最低處理,把ab矛盾的條件進行合併,a歸於b且b歸於a,他們同集就表明不可放到同組,如果出現c不可同組於a(b),則出解。

【源程式】

program prison;

type point=array[1..3]of longint;

var n,m,i,x,y,ans:longint;

c:array[0..100000]of point;

fa:array[0..40000]of longint;

procedure qsort(l,r:longint);

var i,j,x:longint;y:point;

begin

i:=l;j:=r;x:=c[(i+j)div 2,3];

repeat

while c[i,3]>x do inc(i);

while x>c[j,3] do dec(j);

if i<=j then

begin

y:=c[i];c[i]:=c[j];c[j]:=y;

inc(i);dec(j);

end;

until i>j;

if l

noip2010 關押罪犯

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

NOIP 2010 關押罪犯

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

NOIP2010關押罪犯

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