s城現有兩座監獄,一共關押著n名罪犯,編號分別為1−n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用「怨氣值」(乙個正整數值)來表示某兩名罪犯之間
的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為
c 的罪犯被關押在同一監獄,他們倆之間會發生摩擦,並造成影響力為c的衝突事件。
每年年末,警察局會將本年內監獄中的所有衝突事件按影響力從大到小排成乙個列表,然後上報到s 城z 市長那裡。公務繁忙的z 市長只會去看列表中的第乙個事件的影響力,如果影響很壞,他就會考慮撤換警察局長。
在詳細考察了n 名罪犯間的矛盾關係後,警察局長覺得壓力巨大。他準備將罪犯們在兩座監獄內重新分配,以求產生的衝突事件影響力都較小,從而保住自己的烏紗帽。假設只要處於同一監獄內的某兩個罪犯間有仇恨,那麼他們一定會在每年的某個時候發生摩擦。
那麼,應如何分配罪犯,才能使z 市長看到的那個衝突事件的影響力最小?這個最小值是多少?
輸入格式:
每行中兩個數之間用乙個空格隔開。第一行為兩個正整數n,m,分別表示罪犯的數目以及存在仇恨的罪犯對數。接下來的m行每行為三個正整數aj,bj,cj,表示aj號和bj號罪犯之間存在仇恨,其怨氣值為cjc_jcj。資料保證1,且每對罪犯組合只出現一次。
輸出格式:
共1行,為z 市長看到的那個衝突事件的影響力。如果本年內監獄中未發生任何衝突事件,請輸出0。
輸入樣例1:
4614253423
351212
2835113
661824
180534
12884
輸出樣例1:
3512
思路:題目大意是讓我們把罪犯們拆分到兩個集合a、b中,然後拆掉所有連線集合a與集合b的邊,使得集合a與集合b內部最大的邊盡可能的小。
首先我們用最大生成樹對所有的罪犯進行染色,兩個相鄰的點顏色相異,之後輸出仍然在相同集合中最大的邊即可。
正確性:由於我們一開始使用了最大生成樹,拆掉了符合條件的大邊。如果當前還存在一條能拆的邊而且拆掉它會更優,那麼一定會連線上最大生成樹上的一條邊,那麼情況只會更劣,證畢。
**:
#include#include#include
#include
using
namespace
std;
int n,m,f[20008],final,col[20008],head[20008],num_edge,vis[20008
];bool pd[100008
];struct
edgeedge[
100008],path[100008],_edge[20008
<<1
];void get_col(int x,intc)}
void addedge(int
from,int
to)int find(int
x)int
cmp1(edge x,edge y)
intcmp2(edge x,edge y)
long
long
read()
while(ch>='
0'&&ch<='9')
return x*f;
}void
kruskal()
if(num==n-1) break
; }
final=j;
}int
main()
sort(edge+1,edge+m+1
,cmp1);
kruskal();
for(int i=1;i<=final;++i) addedge(path[i].from,path[i].to),addedge(path[i].to,path[i].from
); vis[
1]=1
; get_col(
1,1);
for(int i=1;i<=m;++i)
}printf("0
");return0;
}
P1525 關押罪犯
s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他...
P1525 關押罪犯
題目鏈結 在看了演算法高階指南的二分圖後,就對著方面的題躍躍欲試。這道題目,大佬已經把思路講的很清楚 有題目中明顯的提示 把罪犯分成兩個監獄,在同乙個監獄的罪犯之間的怨氣值要盡 可能小。那麼二分答案判定的東西就出來了。即在同乙個監獄裡的罪犯之間最大怨氣值 但是這個東西有什麼用處呢?1降低時間複雜度,...
P 1525 關押罪犯
1.題目鏈結。這和bzoj 1370是乙個東西 映象並查集。假設a n和a的敵人,把a n這個人叫做a的映象,同理b n是b的映象。然後對於給定的關係x,y連邊,邊權就是怒氣值,然後成了乙個無向帶權圖。1 先說第一種搞法,也是最直觀的。顯然題目的要求就是再說把這個圖刪掉一些邊使之成為二分圖,那麼答案...