NOIP2010關押罪犯

2021-09-25 13:27:11 字數 2734 閱讀 2778

s

ss 城現有兩座監獄,一共關押著n

nn 名罪犯,編號分別為1−n

1-n1−

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

cc 的衝突事件。每年年末,警察局會將本年內監獄中的所有衝突事件按影響力從大到小排成乙個列表,然後上報到s 城z 市長那裡。公務繁忙的z 市長只會去看列表中的第乙個事件的影響力,如果影響很壞,他就會考慮撤換警察局長。在詳細考察了n 名罪犯間的矛盾關係後,警察局長覺得壓力巨大。他準備將罪犯們在兩座監獄內重新分配,以求產生的衝突事件影響力都較小,從而保住自己的烏紗帽。假設只要處於同一監獄內的某兩個罪犯間有仇恨,那麼他們一定會在每年的某個時候發生摩擦。那麼,應如何分配罪犯,才能使z 市長看到的那個衝突事件的影響力最小?這個最小值是少?

輸入第一行為兩個正整數n和m

n 和m

n和m,分別表示罪犯的數目以及存在仇恨的罪犯對數。

接下來的m

mm 行每行為三個正整數aj,

bj,c

ja_j,b_j,c_j

aj​,bj

​,cj

​,表示a

ja_j

aj​ 號和b

jb_j

bj​ 號罪犯之間存在仇恨,其怨氣值為c

jc_j

cj​。資料保證,且每對罪犯組合只出現一次。

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

樣例輸入

4

64~~ 6

461

42534

1 ~~4 ~~2534

142534

2

33512

2 ~~3 ~~3512

233512

1

228351

1 ~~2 ~~28351

122835113

6618

1 ~~3 ~~6618

136618

2

41805

2 ~~4 ~~1805

241805

3

412884

3 ~~4 ~~12884

341288

4(資料經過latex最好不要複製,我只是覺得不加latex有點難看)

樣例輸出

3512

3512

3512 提示

罪犯之間的怨氣值如下面左圖所示,右圖所示為罪犯的分配方法,市長看到的衝突事件

影響力是3512(由2 號和3 號罪犯引發)。其他任何分法都不會比這個分法更優。

【資料範圍】

對於30%的資料有n≤15

n ≤ 15

n≤15

。對於70%的資料有n

≤2000,m

≤50000

n≤ 2000,m≤ 50000

n≤2000

,m≤5

0000

。對於100%的資料有n

≤20000,m

≤100000

n≤ 20000,m≤ 100000

n≤2000

0,m≤

1000

00。要衝突值最小,肯定要先將衝突值從大到小排序,然後乙個個將衝突雙方放入不同監獄,直到無法再放,此時衝突值即為 ans

ansan

s。問題就在於,什麼時候能把雙方放入不同監獄呢?這時候就要用到並查集了。這道題很像noi2001食物鏈,屬於種類並查集的題目。

原則:敵人的敵人就是朋友。處理a和b

a和ba和

b這對衝突時,有兩種情況:

①:如果a和b

a和ba和

b已經在同一陣營,衝突顯然不可避免,於是直接輸出衝突值

②:a ,b

a, b

a,b不在同一陣營,就要把a

aa放入b

bb敵人的陣營,b

bb放入a

aa敵人的陣營

問題在於怎麼表示a,b

a,ba,

b的敵人的陣營呢?

把陣列開大一倍,用b+n

b+nb+

n表示b

bb的敵人就可以了。每次找b

bb敵人的陣營,直接fin

d(b+

n)

find(b+n)

find(b

+n)就可以了。

**如下

#include #include #include #include using namespace std;

#define n 100003

struct node

}d[n];

int f[n];

int find(int x)

int main()

sort(d + 1, d + i);

for(i = 1; i <= 2 * n; i++) f[i] = i;

for(i = 1; i <= m; i++)

f[a] = find(d[i].b + n);

f[b] = find(d[i].a + n);

} printf("0");

return 0;

}

noip2010 關押罪犯

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

NOIP2010關押罪犯

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

NOIP 2010 關押罪犯

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