s
城現有兩座監獄,一共關押著n
名罪犯,編號分別為1−n
。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用「怨氣值」(乙個正整數值)來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c
的罪犯被關押在同一監獄,他們倆之間會發生摩擦,並造成影響力為c
的衝突事件。
每年年末,警察局會將本年內監獄中的所有衝突事件按影響力從大到小排成乙個列表,然後上報到s 城z 市長那裡。公務繁忙的z 市長只會去看列表中的第乙個事件的影響力,如果影響很壞,他就會考慮撤換警察局長。
在詳細考察了n
名罪犯間的矛盾關係後,警察局長覺得壓力巨大。他準備將罪犯們在兩座監獄內重新分配,以求產生的衝突事件影響力都較小,從而保住自己的烏紗帽。假設只要處於同一監獄內的某兩個罪犯間有仇恨,那麼他們一定會在每年的某個時候發生摩擦。
那麼,應如何分配罪犯,才能使z 市長看到的那個衝突事件的影響力最小?這個最小值是多少?
輸入輸出樣例
輸入 #1
4 6輸出 #11 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
據說為練習反集的典例之一,確實值得把玩仔細思考
#includeusingnamespace
std;
typedef
long
long
ll;const
int inf=1e9+7
;inline
intread()
while(c >= '
0' && c <= '
9') x = (x << 3) + (x << 1) + (c ^ 48), c =getchar();
return x *f;
}const
int maxn=20009
;const
int maxm=200019
;struct
edge
p[maxm];
intn,m,fa[maxn],enemy[maxn];
int find(int
k)bool
cmp(edge x,edge y)
intmain()
if(enemy[p[i].nex] == 0) //
如果老子對面的監獄我這坑是空的
enemy[p[i].nex]=p[i].to;//
就把這個討厭玩意兒放對面
else fa[find(enemy[p[i].nex])]=find(p[i].to);
//就把老子討厭的這些玩意兒們放一塊兒
if(enemy[p[i].to] == 0) //
這個必須有,相互放,禮尚往來嘛(雖然是仇家
enemy[p[i].to]=p[i].nex;
else fa[find(enemy[p[i].to])]=find(p[i].nex);
}cout
<< "
0"; //
皆大歡喜 普天同慶
return0;
}
NOIP2010 關押罪犯 虛點並查集
codevs 題目描述 description s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極 不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越...
noip2010 關押罪犯
s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極 不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨 氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之 間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監...
NOIP2010關押罪犯
s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他...