P1525 關押罪犯

2021-09-25 19:29:23 字數 1284 閱讀 5543

題目鏈結

在看了演算法高階指南的二分圖後,就對著方面的題躍躍欲試。

這道題目,大佬已經把思路講的很清楚;

有題目中明顯的提示———把罪犯分成兩個監獄,在同乙個監獄的罪犯之間的怨氣值要盡

可能小。那麼二分答案判定的東西就出來了。

即在同乙個監獄裡的罪犯之間最大怨氣值

但是這個東西有什麼用處呢?

1降低時間複雜度,(好像說了跟沒說一樣)

2修改原圖,刪去權值小於等於判定值的邊,在進行二分圖的判定。

那麼另外乙個問題又出現了———check函式怎麼寫。

二分答案無非就兩點,二分的東西是什麼,現在二分的東西已經解決了,就是同乙個監獄裡的罪犯之間最大怨氣值

是不是只要修改過後的圖是一張二分圖就可以了?

答案是yes;

二分圖的判定方法常見的有染色法。

以下是李煜東大佬的模板

void dfs(int x,int color)

}}int flag=0;

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

if(!book[i])

dfs(i,1);

現在還需要多說一句。因為二分經常性的就是容易寫成死迴圈。

這裡是整數範圍內的二分可以套用以下模板;

while(l>1;

if(check(mid))

r=mid;

else l=mid+1;

}

若還不太理解可以參見《演算法高階指南》。

以下是本人的全部**

#includeusing namespace std;

const int ll=1e6;

int n,m,tot,flag;

int head[ll],next[ll],ver[ll],wer[ll],d[ll],book[ll];

void add(int u,int v,int w)

void dfs(int x,int c,int z)

} }bool check(int w)

return 1;

}int main()

sort(d+1,d+m+1);

int l=0,r=d[m];

while(lelse l=mid+1;

} cout

}

P1525 關押罪犯

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

P 1525 關押罪犯

1.題目鏈結。這和bzoj 1370是乙個東西 映象並查集。假設a n和a的敵人,把a n這個人叫做a的映象,同理b n是b的映象。然後對於給定的關係x,y連邊,邊權就是怒氣值,然後成了乙個無向帶權圖。1 先說第一種搞法,也是最直觀的。顯然題目的要求就是再說把這個圖刪掉一些邊使之成為二分圖,那麼答案...

P1525 關押罪犯

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