wikioi 1069 關押罪犯

2021-06-17 23:38:36 字數 2383 閱讀 1875

s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1~n。他們之間的關係自然也極

不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用「怨

氣值」(乙個正整數值)來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之

間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他們倆之間會發生摩擦,並

造成影響力為c 的衝突事件。

每年年末,警察局會將本年內監獄中的所有衝突事件按影響力從大到小排成乙個列表,

然後上報到s 城z 市長那裡。公務繁忙的z 市長只會去看列表中的第乙個事件的影響力,

如果影響很壞,他就會考慮撤換警察局長。

在詳細考察了n 名罪犯間的矛盾關係後,警察局長覺得壓力巨大。他準備將罪犯們在

兩座監獄內重新分配,以求產生的衝突事件影響力都較小,從而保住自己的烏紗帽。假設只

要處於同一監獄內的某兩個罪犯間有仇恨,那麼他們一定會在每年的某個時候發生摩擦。那

麼,應如何分配罪犯,才能使z 市長看到的那個衝突事件的影響力最小?這個最小值是少?

第一行為兩個正整數n 和m,分別表示罪犯的數目以及存在仇恨的罪犯對數。

接下來的m 行每行為三個正整數aj,bj,cj,表示aj 號和bj 號罪犯之間存在仇恨,其怨氣值為cj。資料保證,

且每對罪犯組合只出現一次。

共1 行,為z 市長看到的那個衝突事件的影響力。如果本年內監獄

中未發生任何衝突事件,請輸出0。

4 6

1 4 2534

2 3 3512

1 2 28351

1 3 6618

2 4 1805

3 4 12884

罪犯之間的怨氣值如下面左圖所示,右圖所示為罪犯的分配方法,市長看到的衝突事件

影響力是3512(由2 號和3 號罪犯引發)。其他任何分法都不會比這個分法更優。

【資料範圍】

對於30%的資料有n≤ 15。

對於70%的資料有n≤ 2000,m≤ 50000。

對於100%的資料有n≤ 20000,m≤ 100000。

按怨氣值排序,把怨氣值大的盡量排在兩個監獄裡,這一點很容易想到。。。

進一步分析,要注意到:如果沒有形成環,只是鏈,把鏈條從中間切斷即可,如圖所示:

另外需要注意的是當形成環時:如果是包含偶數個節點的環,例如上圖中的1——4,此時切斷1--2,2--3,3--4,1--4,仍然不會有衝突;如果是包含奇數個節點的環,例如上圖中的1——3,此時1,2,3之間無論怎樣切割總會產生衝突。如果所有的邊已經排序,那麼最後新增到奇數環內的邊顯示是最小的。

好了,剩下的問題歸結到如何發現奇數環內的最小邊,答案是並查集。網上看到一種很好的思路,如下圖:

首先排序,再將所有人都放在乙個監獄中,當監獄中的情況為鏈時,此時分在兩個監獄內壓根不會產生衝突。當檢測偶數個節點的環時,例如上圖1和4最後新增到監獄中時,此時圓1和圓4或者方1和方4並不在同乙個集合中,因此可以繼續新增圓1——方4,方1——圓4的邊,雖然產生了環,但是這種環並不至於產生不可避免的衝突。只有當奇數邊新增到監獄中時,例如圓1和圓3或者方1和方3新增到集合中時,才會真正產生衝突,而此時衝突又恰恰是怨氣值最大的邊。由於涉及到奇偶,所以巧妙地涉及了圓方兩種狀態,涉及到兩類對稱的集合。

最後上程式,注意要多一條空邊0——0,怨氣值為0,即實在沒有衝突時強制其輸出0:

#include#include#include#include#include#define maxn 20001

#define maxm 100001

typedef struct node;

using namespace std;

int n,m,ans;

int f[maxn+maxn];

node crime[maxm];

void quicksort(int l,int r)

int find(int x)

int main()

else

} printf("%d",crime[ans].anger);

return 0;

}

Wikioi 1069 關押罪犯

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

wikioi1069 關押罪犯

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

CODEVS 1069 關押罪犯

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