應該說這道題不算太難,但挺考察**實現能力。首先我們應該是本著貪心的原則,讓怨氣值大的罪犯盡量分開,這樣就牽扯到將n個點劃分成兩部分的問題。做法有兩種,並查集或二分答案+二分圖染色。值得一提的是並查集(懶),這裡get到了乙個新技能:補集。
一開始,我判斷的方法是,將不能在一起的罪犯加入到乙個並查集,如果遇到衝突(兩個罪犯原先就在乙個並查集裡)則為判定失敗,這樣只有60分。**不對呢?舉個簡單的例子,a和b不能在一起,b和c不能在一起,c和d不能在一起,按照上面的方法,a和d也不能在一起,但實際上a和d可以在一起,這牽扯到兩個點之間隔著奇數個點還是偶數個點。
然後看到dalao題解裡有種方法是使用補集,就是把不能和某個罪犯在一起的罪犯放到一起,因為只有兩個牢房,如果放到一起的罪犯不能在一起,這就是真的衝突了。使用補集要注意一開始初始化時,補集裡的元素也要和其他元素一樣初始化父親為自己。
1 #include 2 #include 3ac**(並查集)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 }
noip2010 關押罪犯
s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極 不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨 氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之 間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監...
NOIP2010關押罪犯
s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他...
NOIP 2010 關押罪犯
題目描述 s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同...