這道題的初始思路肯定會往貪心上面靠吧。
很明顯首先需要對所有的衝突值從大到小排乙個序,因為是從小到大處理,所以肯定是衝突的放在兩個不同的監獄裡,一直到不得不衝突的為止。
主要問題在於:不能直接通過標記罪犯所在的監獄編號來記錄衝突!因為你不能確定把當前罪犯放在監獄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 的罪犯被關押在同...