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複製1 4 2534
2 3 3512
1 2 28351
1 3 6618
2 4 1805
3 4 12884
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。
題解:對於擴充套件域並查集可以看一下擴充套件域並查集
#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
int n, m;
int a, b, c;
int f[40005];
struct node ;
node arr[100005];
bool comp(node a, node b)
int find(int a)
void merge(int a, int b)
int main()
for (int i = 0; i < m; i++)
sort(arr, arr + m, comp);
int f = 0;
for (int i = 0; i < m; i++)
else
}if (f == 0)cout << "0" << endl;
return 0;
}
P1525 關押罪犯 擴充套件域並查集
s城現有兩座監獄,一共關押著n名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他們倆...
P1525 關押罪犯 並查集
評測記錄 有n個罪犯,罪犯有些關係,就是 i j,c i,j,c 表示罪犯i和罪犯j在同乙個監獄會造成c的破壞,有兩座監獄,要求分配的使得最大的破壞最小。先按照c排序,然後就從大到小處理直到無法處理。我們可以用並查集表示在乙個監獄中,然後用敵人的敵人是朋友來合併。記錄每個罪犯的敵人的根,然後每次合併...
並查集 P1525 關押罪犯
s城現有兩座監獄,一共關押著n名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為 c 的罪犯被關押在同一監獄,他們...