洛谷OJ P1525 關押罪犯(種類並查集)

2021-10-09 22:51:11 字數 2084 閱讀 3015

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

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

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

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

每行中兩個數之間用乙個空格隔開。第一行為兩個正整數 n,mn,m,分別表示罪犯的數目以及存在仇恨的罪犯對數。接下來的 mm 行每行為三個正整數 a_j,b_j,c_jaj​,bj​,cj​,表示 a_jaj​ 號和 b_jbj​ 號罪犯之間存在仇恨,其怨氣值為 c_jcj​。資料保證 1共 11 行,為 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
【輸入輸出樣例說明】罪犯之間的怨氣值如下面左圖所示,右圖所示為罪犯的分配方法,市長看到的衝突事件影響力是 35123512(由 22 號和 33 號罪犯引發)。其他任何分法都不會比這個分法更優。

【資料範圍】

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

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

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

思路:一種直觀的思路是將m個關係按照怨氣值從大到小排序,讓怨氣值大的兩個人盡可能的在兩個監獄裡,這裡我們很容易想到可以通過並查集來解決,但是我們並不關心那些人在同乙個集合中,而主要關注兩個人在不在乙個集合中,這可以通過種類並查集來實現(其實本質上還是並查集啦)。

和普通並查集相比,我們需要將陣列開大到原來的兩倍,並給每乙個人乙個假象的敵人,例如低於i,我們令其敵人的編號為i+n。之後仍然是並查集的常規操作,對於該題,我們首先將關係按照怨氣值從大到小排序,每次將兩個點分別和對方的敵人通過並查集連線,也就是說盡可能的讓他們不在乙個集合中(因為乙個人和他的敵人一定不在乙個集合中),直到遇到兩個點已經在乙個集合中,呢他們不可避免的一定要在乙個監獄裡,直接輸出當前怨氣值即可。

#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define mod 1000000007

#define maxn 500050

int n,m,f[maxn/10];

struct nodea[maxn];

bool cmp(node a,node b)

int find(int x)

void merge(int x,int y)

int main(void)

merge(a[i].u,a[i].v+n);

merge(a[i].v,a[i].u+n);

} printf("0\n");

}

洛谷1525 關押罪犯

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

Solution洛谷1525關押罪犯

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

2019 7 17 洛谷 1525 關押罪犯

關押罪犯 並查集先對怒氣值排序 然後一對一對遍歷 如果二者父親相同 那就是無法避免的最大衝突 如果不同 則判斷二者是否已經有必定不能在乙個監獄的物件 若有則讓那個物件的父親變成對手的父親 因為對手必定和物件在同一監獄 若沒有則讓這個物件變成對手 因為對手不能和他在乙個監獄 我又在sort裡的m還是n...