描述 description
s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1~n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用「怨氣值」(乙個正整數值)來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他們倆之間會發生摩擦,並造成影響力為c 的衝突事件。
每年年末,警察局會將本年內監獄中的所有衝突事件按影響力從大到小排成乙個列表,然後上報到s 城z 市長那裡。公務繁忙的z 市長只會去看列表中的第乙個事件的影響力,如果影響很壞,他就會考慮撤換警察局長。
在詳細考察了n 名罪犯間的矛盾關係後,警察局長覺得壓力巨大。他準備將罪犯們在兩座監獄內重新分配,以求產生的衝突事件影響力都較小,從而保住自己的烏紗帽。假設只要處於同一監獄內的某兩個罪犯間有仇恨,那麼他們一定會在每年的某個時候發生摩擦。那麼,應如何分配罪犯,才能使z 市長看到的那個衝突事件的影響力最小?這個最小值是多少?
輸入格式 input format
輸入檔案的每行中兩個數之間用乙個空格隔開。
第一行為兩個正整數n 和m,分別表示罪犯的數目以及存在仇恨的罪犯對數。
接下來的m 行每行為三個正整數aj,bj,cj,表示aj 號和bj 號罪犯之間存在仇恨,其怨氣值為cj。資料保證1<=aj#include using namespace std;
struct edge
;edge prison[100000 + 5];
int pre[20000 + 5];
int ensure[2000 + 5];
int m, n;
bool cmp(edge a, edge b)
int findfather(int x)
return r;
}void mix(int a, int b) ///合併
int main()
for (int i = 1; i <= m; ++i)
if (ensure[xx] == 0) ///如果 xx 還沒有矛盾物件,則設定矛盾物件
ensure[xx] = yy;
else ///如果有矛盾物件,把 yy 和矛盾物件合併
mix(yy, ensure[xx]);
if (ensure[yy] == 0) ///同上
ensure[yy] = xx;
else ///同上
mix(xx, ensure[yy]);
}printf("0\n");
return 0;
}在網上還碰見了40行ac的大牛,貼一下**表示崇敬。#include #include using namespace std;
int n,m,f[40001],x,y;
struct data
e[100001];
int gz(const data &a,const data &b)
int find(int x)
int main()
{ cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>e[i].a>>e[i].b>>e[i].c;
for(int i=1;i<=n*2;i++)
f[i]=i;
sort(e+1,e+m+1,gz);
for(int i=1;i<=m;i++)
{ x=find(e[i].a);
y=find(e[i].b);
if(x==y)
{ cout<
noip2010 關押罪犯
s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極 不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨 氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之 間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監...
NOIP2010關押罪犯
s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他...
NOIP 2010 關押罪犯
題目描述 s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同...