洛谷P1525 關押罪犯

2021-07-14 07:45:56 字數 2216 閱讀 6449

題目描述

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≤ 1,000,000,000,且每對罪犯組合只出現一次。

輸出格式:

共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。

這個題顯然用並查集,將罪犯分成兩部分,使怨氣值最小。

所以我們先要找怨氣值最大的罪犯,將他們分開,然後再繼續找

下一對怨氣值最大的罪犯,再分開。

如果 1 和 2 有衝突,分開 1 和 2 ;

如果 1 和 3 有衝突,分開 1 和 3 ;

如果 2 和 3 也有衝突, 那麼不能把 2 和 3 分開,

因為 2 與 1 ;3 與 1 的衝突更大。(資料處理前要先排序)

如果 1 和 2 不能在乙個監獄,那麼我們用 1 的補集儲存 2 ;

用 2 的 補集 儲存 1(詳細程式見**)。

補集代表 這個人 不能與 他補集中的人在乙個監獄。

那麼就分成了兩部分,對於每一對罪犯,都要查詢他們的

公共祖先,如果找到,那麼那對罪犯的怨氣值就是解。

並查集詳解

#include

#include

#include

using

namespace

std;

struct node v[100011];

int fa[40011];

int find(int x) //並查集

int cmp(const node &x,const node &y) //結構體排序

int main()

sort(v+1,v+m+1,cmp);

for(int i=1;i<=n*2;i++)

fa[i]=i;// n+1->n*2代表1->n的補集

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

int xx=find(v[i].a+n);// 將不能在

int yy=find(v[i].b+n);// 同乙個監獄的

fa[xx]=y;// 罪犯分開

fa[yy]=x;// 也就是放到對方的補集

}printf("0");

return

0;}

洛谷 P1525 關押罪犯

拿到這題看都沒看直接寫了個裸地貪心 並查集 寫完就發現一點問題 include include include include include using namespace std int n,m,g 40010 struct pi pe 100010 bool cmp pi aa,pi bb i...

洛谷P1525 關押罪犯

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

關押罪犯 洛谷p1525

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