解題思路:根據題目描述要將n名罪犯分在2座監獄中,可以考慮用二分圖來解答問題,將每名罪犯看為乙個點,存在仇恨的罪犯間連一條無向邊。要使發生衝突的影響力最小,這裡給出兩種解答方法,方法一:運用一點貪心的思想,讓衝突小的發生來使得衝突大的不發生,即將邊按權值由小到大進行排序,刪除當前權值最小的邊,判斷所得圖是否為二分圖,若是則輸出該邊的值,若不是則繼續刪除。需要注意的是,為了能將邊按權值排序,需使用邊集陣列。但該方法時間複雜度為o(n*(n+m))對於資料大的會超時。推薦的是方法二:利用二分猜答案的思想,猜測每次刪除的邊的最大值,判斷刪除後的圖是否為二分圖,注意該刪除為假刪除。在提交評測時,發現該方法理論上時間複雜度為o(32*(n+m))應該不會超時,但評測結果對於最大的兩組資料仍然超時,於是在bfs(二分圖判斷)中使用手工佇列,以改進使用stl佇列超時的問題。
#include#include#include#include#include#include#includeusing namespace std;
const int maxn=20005;
int n,m,a,b,c;
vectorg[maxn],w[maxn];
int color[maxn];
int q[maxn];
int front,rear;
bool bfs(int i,int p) //用p來表示刪除的邊的最大值,不用將邊真正刪去(假刪除)
{ front=rear=1; //使用手工佇列代替stl佇列
q[rear++]=i;
color[i]=1;
while(front!=rear)
{ int i=q[front++];
for(int k=0;k
NOIP2010 提高組 關押罪犯
s 城現有兩座監獄,一共關押著 n 名罪犯,編號分別為 1 n 他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為 c 的罪犯被關押在同一監...
NOIp2010提高組 關押罪犯
oj題號 洛谷1525 思路 貪心。先將所有的人按怨氣值從大到小排一下,然後依次嘗試將雙方分入兩個不同的監獄,如果失敗 即已分入相同的監獄 則輸出這個怨氣值。1 include2 include3 include4 struct edge 9 10const int n 20001 11 class...
NOIP2010提高組複賽C 關押罪犯
略這題是並查集的乙個變題,先按積怨值從大到小排序,然後乙個乙個看能否完全分開,遇到的第乙個不能分開的囚犯對 如果強行分開就必然有更高的積怨值出現 就是答案。一開始想到的是按監獄數量弄個並查集,後來發現並不行,因為如果要分開一對囚犯,沒辦法決定誰一定住1號監獄,誰一定住2號監獄。後來試了下用囚犯數量弄...