關押罪犯 並查集 二分

2021-07-26 19:35:36 字數 1490 閱讀 8551

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

每年年末,警察局會將本年內監獄中的所有衝突事件按影響力從大到小排成乙個列表,然後上報到s 城z 市長那裡。公務繁忙的z 市長只會去看列表中的第乙個事件的影響力,如果影響很壞,他就會考慮撤換警察局長。

在詳細考察了n 名罪犯間的矛盾關係後,警察局長覺得壓力巨大。他準備將罪犯們在兩座監獄內重新分配,以求產生的衝突事件影響力都較小,從而保住自己的烏紗帽。假設只要處於同一監獄內的某兩個罪犯間有仇恨,那麼他們一定會在每年的某個時候發生摩擦。

那麼,應如何分配罪犯,才能使z 市長看到的那個衝突事件的影響力最小?這個最小值是多少?

a、並查集

把邊按權值從大到小排序,再順次將各個邊上的兩點x,y並查集所在的子樹合併,當有衝突時,當前邊的權就是所求。(類似於poj2492 a bug's life)。

**:

#include#include#include#includeusing namespace std;

int n,m;

struct edge

edge(int xx,int yy,int zz)

};vectora;

int fa[20005]= ;

bool k[20005]= ;

int find(int x)

int y=find(fa[x]);

k[x]=k[x]^k[fa[x]];

return fa[x]=y;

}bool my_cmp(edge x,edge y)

return false;

}int main()

sort(a.begin(),a.end(),my_cmp);

bool flag=true;

for(int i=0; i

二分可能的答案。判斷答案是否可行時,就相當於判斷去掉邊權比當前答案x小的邊後的圖是否是二分圖,用二分圖染色判斷就可以了。

#include#include#include#includeusing namespace std;

int n,m;

struct edge

edge(int yy,int zz)

};vectora[20005];

int color[20005]= ;

bool dfs(int x,int fa,int num)

}} if(left!=middle) }

if(left==0&&right==1) printf("0");

else printf("%d",right);

return 0;

}

注意,此題答案為0時要單獨判斷。

並查集 關押罪犯

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

NOIP 關押罪犯(並查集)

時間限制 1 sec 記憶體限制 128 mb 提交 94 解決 32 提交 狀態 討論版 命題人 admin s城現有兩座監獄,一共關押著n名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩...

並查集的補集 (關押罪犯)

定義元素t的逆為t,t一定不在包含t的集合裡 因為對於兩個需要分配在不同集合的元素a b,我們並不知道具體該怎麼分,所以就令元素a和b在一起,元素b和a在一起。避免了直接分配a,b到哪乙個集合的問題!自己模擬最快明白 例題 關押罪犯2010年noip全國聯賽提高組 include using nam...