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