P 1525 關押罪犯

2021-09-27 10:45:09 字數 883 閱讀 2056

1.題目鏈結。這和bzoj 1370是乙個東西:映象並查集。假設a+n和a的敵人,把a+n這個人叫做a的映象,同理b+n是b的映象。然後對於給定的關係x,y連邊,邊權就是怒氣值,然後成了乙個無向帶權圖。

(1)先說第一種搞法,也是最直觀的。顯然題目的要求就是再說把這個圖刪掉一些邊使之成為二分圖,那麼答案具有單調性。直接二分答案,然後暴力check。check每乙個值可以採用染色做,當前點賦值為1,然後和它相連的全部都是0.因為二分圖有乙個十分重要的性質,就是不存在奇環,如果發現染色失敗,那麼不行,否則輸出答案即可。

(2)還是開始提到的做法,因為敵人的敵人就是朋友(其實這條性質,對映到二分圖中,就是證明二分圖不存在奇環的關鍵所在,所以這也是為什麼這個題可以等價使用二分圖染色做的根本原因)。所以對於a,我們需要把它合併到b+n這個集合所在的集合裡,同理b合併到a+n所在的集合裡。但是怎麼保證最小呢?可以這樣考慮:我們貪心的選擇先把邊權最大的安排了,然後從大到小一次安排,直到發現矛盾,說明這時已經安排好了,那麼就是答案。

#includeusing namespace std;

const int m = 100010;

struct edge

e[m];

int fa[2 * m];

int find(int x)

int main()

sort(e + 1, e + m + 1, (edge x, edge y) );

int flag = 0;

for (int i = 1; i <= m; i++)

fa[find(x)] = find(e[i].y + n);

fa[find(y)] = find(e[i].x+n);

} if (!flag)

}

P1525 關押罪犯

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

P1525 關押罪犯

題目鏈結 在看了演算法高階指南的二分圖後,就對著方面的題躍躍欲試。這道題目,大佬已經把思路講的很清楚 有題目中明顯的提示 把罪犯分成兩個監獄,在同乙個監獄的罪犯之間的怨氣值要盡 可能小。那麼二分答案判定的東西就出來了。即在同乙個監獄裡的罪犯之間最大怨氣值 但是這個東西有什麼用處呢?1降低時間複雜度,...

P1525 關押罪犯

貪心 並查集維護 先進性排序,將怨氣值最大的一對拆開,分別找出每乙個人的 死敵 然後和自己的 死敵 分離開 用並查集維護就可以 最後只需要找出第乙個兩個人必須在乙個監獄的情況 也就是在同乙個並查集中 就是最後的答案。舉個例子 先貪心按照權值大小進行排序,在列舉到兩個人u,v u,vu,v時u v u...