P1525 關押罪犯 擴充套件域並查集

2022-04-30 21:45:13 字數 2477 閱讀 2603

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

每年年末,警察局會將本年內監獄中的所有衝突事件按影響力從大到小排成乙個列表,然後上報到s 城z 市長那裡。公務繁忙的z 市長只會去看列表中的第乙個事件的影響力,如果影響很壞,他就會考慮撤換警察局長。

在詳細考察了n名罪犯間的矛盾關係後,警察局長覺得壓力巨大。他準備將罪犯們在兩座監獄內重新分配,以求產生的衝突事件影響力都較小,從而保住自己的烏紗帽。假設只要處於同一監獄內的某兩個罪犯間有仇恨,那麼他們一定會在每年的某個時候發生摩擦。

那麼,應如何分配罪犯,才能使z 市長看到的那個衝突事件的影響力最小?這個最小值是多少?

輸入格式:

每行中兩個數之間用乙個空格隔開。第一行為兩個正整數n,m,分別表示罪犯的數目以及存在仇恨的罪犯對數。接下來的m行每行為三個正整數aj​,bj​,cj​,表示aj​號和bj​號罪犯之間存在仇恨,其怨氣值為cj​。資料保證1,且每對罪犯組合只出現一次。

輸出格式:

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

輸入樣例#1: 

4 6

1 4 2534

2 3 3512

1 2 28351

1 3 6618

2 4 1805

3 4 12884

輸出樣例#1: 

3512
【輸入輸出樣例說明】罪犯之間的怨氣值如下面左圖所示,右圖所示為罪犯的分配方法,市長看到的衝突事件影響力是3512(由2號和3號罪犯引發)。其他任何分法都不會比這個分法更優。

【資料範圍】

對於30%的資料有n≤15。

對於70%的資料有n≤2000,m≤50000。

對於100%的資料有n≤20000,m≤100000。

這道題可以作為並查集擴充套件域的入門題目,在做過這道題後,我們會對擴充套件域有更深刻的理解。

【什麼是擴充套件域】

鄙人薄見:擴充套件域用以維護較抽象的物件之間的邏輯關係,由於有點抽象,所以理解起來有點費勁。

擴充套件域將資料之間的關係分類,將物件之間不同的關係分開討論,並在這些資料之間建立聯絡。

而且,這樣的關係最好要具有傳遞性,這樣某物件之間的關係就能相互匯出。

這裡難以理解的一點主要是,擴充套件域僅僅維護物件之間的關係,而不關心物件的其他特徵

ps:目前為止,我只見到過維護二元關係的擴充套件域並查集。

就拿這一題舉例吧,假設x和y在同乙個監獄裡,那麼他們必然不會在不同的監獄裡;如果x和y在不同的監獄裡,那他們就不會在同乙個監獄裡。

聽起來有點繞,我們分析一下:如果有一組關係表明x和y在同乙個監獄,那麼就可以推導出另一組關係x和y不會在不同的監獄。反之亦然。

於是我們可以給乙個並查集劃分幾個不同的種類(或者叫域),用來存放物件之間不同的關係。

說說這道題我的解題思路吧:按照怨氣值把較大的兩個人分開,直到分不下去(兩個罪犯無法避免在同乙個監獄裡)。

1.邊權值大到小排序。

2.每次維護並查集:

x_self表示x所在監獄,x_another表示另1個監獄。

刪一條邊就把x_self和y_another合併,y_self和x_another合併。

前提條件:分不下去:二者在乙個監獄(x_self=y_self||x_another=y_another)。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

#define n 100010

9using

namespace

std;

10struct

pa[n];

13bool

operator

16int head[n<<1],fa[n<<3

],tot,n,m;

17int

get(int

x)18

22void merge(int x,int

y)23

27int

main()

2834 sort(a+1,a+m+1

);35

int ans=0;36

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

42merge(x_self,y_another);

43merge(x_another,y_self);44}

45 cout

46return0;

47 }

P1525 關押罪犯(擴充套件域並查集)

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

P1525 關押罪犯 並查集

評測記錄 有n個罪犯,罪犯有些關係,就是 i j,c i,j,c 表示罪犯i和罪犯j在同乙個監獄會造成c的破壞,有兩座監獄,要求分配的使得最大的破壞最小。先按照c排序,然後就從大到小處理直到無法處理。我們可以用並查集表示在乙個監獄中,然後用敵人的敵人是朋友來合併。記錄每個罪犯的敵人的根,然後每次合併...

並查集 P1525 關押罪犯

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