s城現有兩座監獄,一共關押著n名罪犯,編號分別為1~n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用「怨氣值」(乙個正整數值)來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c的罪犯被關押在同一監獄,他們倆之間會發生摩擦,並造成影響力為c的衝突事件。每年年末,警察局會將本年內監獄中的所有衝突事件按影響力從大到小排成乙個列表,然後上報到s城z市長那裡。公務繁忙的z市長只會去看列表中的第乙個事件的影響力,如果影響很壞,他就會考慮撤換警察局長。在詳細考察了n名罪犯間的矛盾關係後,警察局長覺得壓力巨大。他準備將罪犯們在兩座監獄內重新分配,以求產生的衝突事件影響力都較小,從而保住自己的烏紗帽。假設只要處於同一監獄內的某兩個罪犯間有仇恨,那麼他們一定會在每年的某個時候發生摩擦。那麼,應如何分配罪犯,才能使z市長看到的那個衝突事件的影響力最小?這個最小值是多少?
輸入檔案的每行中兩個數之間用乙個空格隔開。
第一行為兩個正整數n和m,分別表示罪犯的數目以及存在仇恨的罪犯對數。
接下來的m行每行為三個正整數aj,bj,cj,表示aj號和bj號罪犯之間存在仇恨,其怨氣值為cj。
資料保證1<=aj<=bj<=n,0<=cj<=1000000000,且每對罪犯組合只出現一次。
輸出檔案共1行,為z市長看到的那個衝突事件的影響力。如果本年內監獄中未發生任何衝突事件,請輸出0
46142534
233512
1228351
136618
241805
3412884
每個測試點1s
分配方法:市長看到的衝突事件影響力是3512(由2號和3號罪犯引發)。其他任何分法都不會比這個分法更優。
對於30%的資料有n≤15。
對於70%的資料有n≤2000,m≤50000。
對於100%的資料有n≤20000,m≤100000。
最簡單的方法還是並查集。開乙個兩倍的並查集表示犯人的集合及其補集,排序按怨念從大到小往集合裡放,發現衝突直接輸出就可以了。
排序直接呼叫的中的 sort(a+1, a+n+1)。並查集是標準的一行式路徑壓縮,每次查詢確認不衝突後分別放到對方的補集中。空間 o(2n),時間 o(m lg*n),其中 lg*n 最大為 5 效率很高,90分。
最後注意沒有衝突要輸出 0,這樣才能 100 分。
1 #include2 #include3 #include4 #include5#define maxn 20005
6#define maxm 100005
7using
namespace
std;
8int n,m,x,y,fa[2*maxn];
9struct
skye[maxm];
12bool
cmp(sky p1,sky p2)
15int
read()
18while(ch>='
0'&&ch<='9')
19return x*f;20}
21int find(int
x)25
intmain()
36 fa[y]=find(e[i].a+n);
37 fa[x]=find(e[i].b+n);38}
39 puts("0"
);40
return0;
41 }
noip2010 關押罪犯
s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極 不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨 氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之 間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監...
NOIP2010關押罪犯
s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他...
NOIP 2010 關押罪犯
題目描述 s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同...