NOIP2010 關押罪犯 虛點並查集

2021-07-11 14:07:32 字數 2678 閱讀 8143

codevs:

題目描述 description

s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1~n。他們之間的關係自然也極

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

輸入描述 input description

第一行為兩個正整數n 和m,分別表示罪犯的數目以及存在仇恨的罪犯對數。

接下來的m 行每行為三個正整數aj,bj,cj,表示aj 號和bj 號罪犯之間存在仇恨,其怨氣值為cj。資料保證,且每對罪犯組合只出現一次。

輸出描述 output description

共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
資料範圍及提示 data size & hint罪犯之間的怨氣值如下面左圖所示,右圖所示為罪犯的分配方法,市長看到的衝突事件

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

【資料範圍】

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

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

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

題解這個題目我似乎還是考完noip之後在ac了,我太弱了,原來一直知道怎麼寫但是一直沒有寫,現在再出來寫解題報告給學弟學妹們看算是造福一中的oier了吧。

這個題目第一眼看上去要讓爆發的怒氣值最小於是就想到了二分【我會補上二分寫這個題的題解的】,但是這個題目我們有更優時間複雜度的解法:並查集。思路也蠻簡單就是盡量把怒氣值很大的那幾對囚犯分開來放,然後在判斷會不會發生衝突,誒,似乎和最小生成樹的思路很像啊。

但是仔細想一想,實現的時候有一點問題,我們並查集只能把罪犯放在一起啊,怎麼把罪犯分開來放呢?這兒一般有兩種處理方法

虛點並查集

帶權並查集

本題解中我們使用簡單易懂但是時間、空間複查度的常數稍微大一點帶來的虛點並查集。

虛點並查集思路如下:

我們多開了一倍的陣列,用a+n表示a的敵人、b的朋友

b+n表示a的朋友、b的敵人

每次把a和b分離的操作改為,將a和b+n合併,b和a+n合併。

也就是a和a的朋友、b的敵人(b+n)合併,b和b的朋友、a的敵人(b+n)合併。這樣只最終每次合併的時候直接判斷a和b是否在乙個陣列就可以了。

**:

/*

題目:p1069 關押罪犯

*/#include

#include

#include

#include

#include

#include

#include

#include

const

int maxn=400005;

using

namespace

std;

long

long n,m,father[maxn],sum,rank[maxn],y;

struct node

long

long u;

long

long v;

long

long c;

}head[maxn],x;

priority_queueq;

long

long getfather(int x)

void read_column_number()

}void union(int x,int y)

else

}void kruskal()

}cout

<

}int main()

noip2010 關押罪犯

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

NOIP2010關押罪犯

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

NOIP 2010 關押罪犯

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