1. 程式人生 > >noip2010(關押罪犯)

noip2010(關押罪犯)

每年 print IV code sub ont 警察局 esp LG

4844: Noip2010 關押罪犯

Time Limit: 4 Sec Memory Limit: 128 MB
Submit: 18 Solved: 12
[Submit][Status][Web Board]

Description

S城現有兩座監獄,一共關押著 N名罪犯,編號分別為 1~N。他們之間的關系自然也極不和諧。很多罪犯之間甚至
積怨已久,如果客觀條件具備則隨時可能爆發沖突。我們用“怨氣值” (一個正整數值)來表示某兩名罪犯之間
的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為 c 的罪犯被關押在同一監獄,他們
倆之間會發生摩擦,並造成影響力為 c 的沖突事件。每年年末,警察局會將本年內監獄中的所有沖突事件按影響
力從大到小排成一個列表,然後上報到 S 城 Z 市長那裏。公務繁忙的 Z 市長只會去看列表中的第一個事件的影
響力,如果影響很壞,他就會考慮撤換警察局長。在詳細考察了 N 名罪犯間的矛盾關系後,警察局長覺得壓力巨
大。他準備將罪犯們在兩座監獄內重新分配,以求產生的沖突事件影響力都較小,從而保住自己的烏紗帽。假設只
要處於同一監獄內的某兩個罪犯間有仇恨,那麽他們一定會在每年的某個時候發生摩擦。那麽,應如何分配罪犯,
才能使 Z 市長看到的那個沖突事件的影響力最小?這個最小值是多少?

Input

輸入文件的每行中兩個數之間用一個空格隔開。
第一行為兩個正整數 N和 M,分別表示罪犯的數目以及存在仇恨的罪犯對數。
接下來的 M行每行為三個正整數 aj,bj,cj,表示 aj號和 bj號罪犯之間存在仇恨,其怨
氣值為 cj。數據保證 N b a j j
≤ < ≤ 1 , 000 , 000 , 000 , 1 0 ≤ < j
c ,且每對罪犯組合只出現一次。
n<=20000, m<=100000

Output

共1 行,為 Z 市長看到的那個沖突事件的影響力。如果本年內監獄
中未發生任何沖突事件,請輸出 0。

Sample Input

4 6 
1 4 2534 
2 3 3512 
1 2 28351 
1 3 6618 
2 4 1805 
3 4 12884 

Sample Output

3512

HINT

按怨氣值從小到大排序,那麽找到的第一個發生沖突的即為最大值,

建一個2n大的並查集,一個為a監獄一個為b監獄,

不斷把x,y,放到不同的監獄中去,直到出現矛盾為止

#include<cstdio>
#include<algorithm>
using namespace std;

struct my{
    int a,b,c;
};

const int maxn=100000+10;
my zui[maxn];
int fa[maxn];

bool cmp(const my x,const my y){
     return
x.c>y.c; } int getfa(int x){ if(x==fa[x]) return fa[x]; return fa[x]=getfa(fa[x]); } int main(){ int n,m; scanf("%d%d",&n,&m); for (int i=1;i<=n*2;i++) fa[i]=i; for (int i=1;i<=m;i++) scanf("%d%d%d",&zui[i].a,&zui[i].b,&zui[i].c); sort(zui+1,zui+1+m,cmp); for(int i=1;i<=m;i++){ int x=getfa(zui[i].a); int y=getfa(zui[i].b); if(x==y){ printf("%d\n",zui[i].c); return 0; } fa[y]=getfa(zui[i].a+n); fa[x]=getfa(zui[i].b+n); } printf("0\n"); return 0; }

noip2010(關押罪犯)