$s$ 城現有兩座監獄,一共關押著 $n$ 名罪犯,編號分別為 $1-n$。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用「怨氣值」(乙個正整數值)來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為 $c$ 的罪犯被關押在同一監獄,他們倆之間會發生摩擦,並造成影響力為 $c$的衝突事件。
每年年末,警察局會將本年內監獄中的所有衝突事件按影響力從大到小排成乙個列表,然後上報到 $s$ 城 $z$ 市長那裡。公務繁忙的 $z$ 市長只會去看列表中的第乙個事件的影響力,如果影響很壞,他就會考慮撤換警察局長。
在詳細考察了$n$ 名罪犯間的矛盾關係後,警察局長覺得壓力巨大。他準備將罪犯們在兩座監獄內重新分配,以求產生的衝突事件影響力都較小,從而保住自己的烏紗帽。假設只要處於同一監獄內的某兩個罪犯間有仇恨,那麼他們一定會在每年的某個時候發生摩擦。
那麼,應如何分配罪犯,才能使 $z$市長看到的那個衝突事件的影響力最小?這個最小值是多少?
每行中兩個數之間用乙個空格隔開。第一行為兩個正整數 $n,m$,分別表示罪犯的數目以及存在仇恨的罪犯對數。接下來的 m 行每行為三個正整數 $a_j,b_j,c_j$,表示 $a_j$號和$b_j$號罪犯之間存在仇恨,其怨氣值為 $c_j$。資料保證$1< a_j \leq b_j \leq n,0< c_j \leq 10^9$,且每對罪犯組合只出現一次。
共 $1$行,為 $z$ 市長看到的那個衝突事件的影響力。如果本年內監獄中未發生任何衝突事件,請輸出 $0$。
輸入
4 6輸出1 4 2534
2 3 3512
1 2 28351
1 3 6618
2 4 1805
3 4 12884
3512【輸入輸出樣例說明】罪犯之間的怨氣值如下面左圖所示,右圖所示為罪犯的分配方法,市長看到的衝突事件影響力是 $3512$(由 $2$號和 $3$號罪犯引發)。其他任何分法都不會比這個分法更優。
【資料範圍】
對於 $30 \%$的資料有 $n \leq 15$。
對於 $70 \%$的資料有 $n \leq 2 \times 10^3,m \leq 5 \times 10^4$。
對於 $100 \%$的資料有 $n \leq 2 \times 10^4,m \leq 1\times 10^5$。
此題是乙個並查集的題,思路很簡單,我們把怒氣值大的盡量不要放在乙個監獄中,再遵循敵人的敵人就是朋友這一條原則來分配監獄,如果有一對罪犯不可避免地出現在乙個監獄中,那就輸出。。。
我們先按怒氣值從大到小排序。。。
1 #include2using
namespace
std;
3struct
dataa[1000001];6
int n,m,fa[1000001],ans,diren[1000001];7
int find(int x)
10void add(int x,int
y)13
bool
cmp(data x,data y)
16int
main()
28if(!diren[a[i].x])//
敵人的敵人是朋友
29 diren[a[i].x]=a[i].y;
30else
31add(diren[a[i].x],a[i].y);
32if(!diren[a[i].y])//
同上 33 diren[a[i].y]=a[i].x;
34else
35add(diren[a[i].y],a[i].x);36}
37 printf("
%d\n
",ans);
38return0;
39 }
NOIp2010提高組 關押罪犯
oj題號 洛谷1525 思路 貪心。先將所有的人按怨氣值從大到小排一下,然後依次嘗試將雙方分入兩個不同的監獄,如果失敗 即已分入相同的監獄 則輸出這個怨氣值。1 include2 include3 include4 struct edge 9 10const int n 20001 11 class...
NOIP2010提高組 關押罪犯 解題報告
解題思路 根據題目描述要將n名罪犯分在2座監獄中,可以考慮用二分圖來解答問題,將每名罪犯看為乙個點,存在仇恨的罪犯間連一條無向邊。要使發生衝突的影響力最小,這裡給出兩種解答方法,方法一 運用一點貪心的思想,讓衝突小的發生來使得衝突大的不發生,即將邊按權值由小到大進行排序,刪除當前權值最小的邊,判斷所...
NOIP2010提高組複賽C 關押罪犯
略這題是並查集的乙個變題,先按積怨值從大到小排序,然後乙個乙個看能否完全分開,遇到的第乙個不能分開的囚犯對 如果強行分開就必然有更高的積怨值出現 就是答案。一開始想到的是按監獄數量弄個並查集,後來發現並不行,因為如果要分開一對囚犯,沒辦法決定誰一定住1號監獄,誰一定住2號監獄。後來試了下用囚犯數量弄...