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:1 4 2534
2 3 3512
1 2 28351
1 3 6618
2 4 1805
3 4 12884
3512【輸入輸出樣例說明】罪犯之間的怨氣值如下面左圖所示,右圖所示為罪犯的分配方法,市長看到的衝突事件影響力是3512(由2 號和3 號罪犯引發)。其他任何分法都不會比這個分法更優。
【資料範圍】對於30%的資料有n≤ 15。對於70%的資料有n≤ 2000,m≤ 50000。對於100%的資料有n≤ 20000,m≤ 100000。
貪心的思路並不難想
關鍵是如何維護兩人不在同一監獄中
並查集補集的思想真的巧妙
花了一點時間來理解補集的意思
如果a和b在同一集合中,說明a和b不在同乙個監獄裡面
如果b和c在同一集合中,說明b和c不在同乙個監獄裡面
如果上述兩者同時成立,即a和c在同一集合中,那麼a與c一定在同乙個監獄中,不符合,可直接輸出答案
那麼排序後從大到小開始列舉
如果a和b不在同一集合中
就合併a和b(補 )表示a和b不在同一補集中
再合併b和a(補)
表示a和b不在同一補集中
a(補)=a+n;
b(補)=b+n;
簡而言之 敵人的敵人是朋友
#include#define maxn 20001
#define maxm 100001
using namespace std;
template void read(t &x)
int n,m;
int fa[2*maxn],num[2*maxn];
struct edgeedge[maxm];
bool cmp(const edge&a,const edge&b)
void debug(){
for(int i=1;i<=2*n;++i)cout<
CODEVS 1069 關押罪犯
s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他...
Codevs 1069關押罪犯 Noip2010
ac通道 分析 可以發現,因為市長只會關心衝突事件影響力的最大值,所以無論你怎麼把罪犯們分開,只要衝突事件影響力最大的那兩個人還在同一所監獄,衝突事件影響力的最大值就不會改變。所以我們可以採取貪心的思想,每次將衝突事件影響力最大的兩個人分開,直到這兩個人根據前面的條件,已經分不開了,那麼最大值就是他...
codevs3731 luogu2296 尋找道路
在有向圖g 中,每條邊的長度均為1 現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件1 的情況下使路徑最短。注意 圖g 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度。輸入格式...