noip2010 關押罪犯 題解

2021-09-18 02:40:56 字數 982 閱讀 6765

這道題的初始思路肯定會往貪心上面靠吧。

很明顯首先需要對所有的衝突值從大到小排乙個序,因為是從小到大處理,所以肯定是衝突的放在兩個不同的監獄裡,一直到不得不衝突的為止。

主要問題在於:不能直接通過標記罪犯所在的監獄編號來記錄衝突!因為你不能確定把當前罪犯放在監獄1裡或者監獄2裡,與後面的罪犯衝突的情況下最優。

於是我們建立並查集,對於每個罪犯,與其衝突的罪犯就併入其補集裡,當任意兩個罪犯都在另乙個罪犯補集裡時且有衝突,就輸出答案,因為衝突從大到小處理,可以證明這樣是最優解。

#include

#include

#include

#include

#include

using namespace std;

int fa[

40010

],n,m,tot1,tot2;

struct ag

ct[100005];

inline bool cmp

(ag cp1,ag cp2)

inline

intget

(int x)

inline

void

merge

(int x,

int y)

intmain()

sort

(ct+

1,ct+m+

1,cmp)

;for

(register

int i=

1;i<=m;i++

) fa[

get(ct[i]

.x)]

=get

(ct[i]

.y+n)

; fa[

get(ct[i]

.y)]

=get

(ct[i]

.x+n);}

cout<<0;

return0;

}

noip2010 關押罪犯

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

NOIP2010關押罪犯

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

NOIP 2010 關押罪犯

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