NOIP2010 關押罪犯

2022-07-16 20:15:12 字數 922 閱讀 5780

應該說這道題不算太難,但挺考察**實現能力。首先我們應該是本著貪心的原則,讓怨氣值大的罪犯盡量分開,這樣就牽扯到將n個點劃分成兩部分的問題。做法有兩種,並查集或二分答案+二分圖染色。值得一提的是並查集(懶),這裡get到了乙個新技能:補集。

一開始,我判斷的方法是,將不能在一起的罪犯加入到乙個並查集,如果遇到衝突(兩個罪犯原先就在乙個並查集裡)則為判定失敗,這樣只有60分。**不對呢?舉個簡單的例子,a和b不能在一起,b和c不能在一起,c和d不能在一起,按照上面的方法,a和d也不能在一起,但實際上a和d可以在一起,這牽扯到兩個點之間隔著奇數個點還是偶數個點。

然後看到dalao題解裡有種方法是使用補集,就是把不能和某個罪犯在一起的罪犯放到一起,因為只有兩個牢房,如果放到一起的罪犯不能在一起,這就是真的衝突了。使用補集要注意一開始初始化時,補集裡的元素也要和其他元素一樣初始化父親為自己。

1 #include 2 #include 3

4using

namespace

std;

56 inline int

get_num()

1415

const

int maxn = 2e4 + 5, maxm = 1e5 + 5;16

17struct

edge

22} edge[maxm];

2324

int fa[2 *maxn];

2526

int dj_find(int

i) 30

31 inline void dj_merge(int a, int

b) 34

35int

main() else50}

51 printf("0"

);52

return0;

53 }

ac**(並查集)

noip2010 關押罪犯

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

NOIP2010關押罪犯

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

NOIP 2010 關押罪犯

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