NOIp2010提高組 關押罪犯

2022-05-22 02:00:12 字數 745 閱讀 7058

oj題號:洛谷1525

思路:貪心。

先將所有的人按怨氣值從大到小排一下,然後依次嘗試將雙方分入兩個不同的監獄,如果失敗(即已分入相同的監獄),則輸出這個怨氣值。

1 #include2 #include3 #include4

struct

edge 9};

10const

int n=20001;11

class

unionfindset

17public

:18 unionfindset(const

intn)

21bool isconnected(const

int x,const

inty)

24void union(const

int x,const

inty)

27};

28int

main()

35 std::sort(&e[0],&e[m],std::greater());

36unionfindset s(n);

37for(int i=0;i)

42 s.union(e[i].u,e[i].v+n);

43 s.union(e[i].v,e[i].u+n);44}

45 puts("0"

);46

return0;

47 }

NOIP2010 提高組 關押罪犯

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

NOIP2010提高組 關押罪犯 解題報告

解題思路 根據題目描述要將n名罪犯分在2座監獄中,可以考慮用二分圖來解答問題,將每名罪犯看為乙個點,存在仇恨的罪犯間連一條無向邊。要使發生衝突的影響力最小,這裡給出兩種解答方法,方法一 運用一點貪心的思想,讓衝突小的發生來使得衝突大的不發生,即將邊按權值由小到大進行排序,刪除當前權值最小的邊,判斷所...

NOIP2010提高組複賽C 關押罪犯

略這題是並查集的乙個變題,先按積怨值從大到小排序,然後乙個乙個看能否完全分開,遇到的第乙個不能分開的囚犯對 如果強行分開就必然有更高的積怨值出現 就是答案。一開始想到的是按監獄數量弄個並查集,後來發現並不行,因為如果要分開一對囚犯,沒辦法決定誰一定住1號監獄,誰一定住2號監獄。後來試了下用囚犯數量弄...