【BZOJ】3390: [Usaco2004 Dec]Bad Cowtractors牛的報復

Description

    奶牛貝茜被僱去建設N(2≤N≤1000)個牛棚間的互聯網.她已經勘探出M(1≤M≤
20000)條可建的線路,每條線路連接兩個牛棚,而且會苞費C(1≤C≤100000).農夫約翰吝嗇得很,他希望建設費用最少甚至他都不想給貝茜工錢. 貝茜得知工錢要告吹,決定報復.她打算選擇建一些線路,把所有牛棚連接在一起,讓約翰花費最大.但是她不能造出環來,這樣約翰就會發現.

Input

  第1行:N,M.
  第2到M+1行:三個整數,表示一條可能線路的兩個端點和費用.
 

Output

 
    最大的花費.如果不能建成合理的線路,就輸出-1

Sample Input

5 8
1 2 3
1 3 7
2 3 10
2 4 4
2 5 8
3 4 6
3 5 2
4 5 17

Sample Output

42

連接4和5,2和5,2和3,1和3,花費17+8+10+7=42

HINT

Source

  題解:

  最大生成樹。不要問我爲什麼。。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN=20001;
struct xx
{
	int from,to,w;
}e[MAXN<<1];
int father[MAXN],cnt,n,m;
long long tot=0;
bool cmp(xx a,xx b)
{
	return a.w>b.w;
}
void add(int x,int y,int z)
{
	cnt++;
	e[cnt].from=x;
	e[cnt].to=y;
	e[cnt].w=z;
}
int find(int x)
{
	if(x==father[x]) return x;
	father[x]=find(father[x]);
	return father[x];
}
void Kruskal()
{
	int i=1,d=0;
	while(i<=m&&d<n)
	{
		int x=e[i].from;
		int y=e[i].to;
		if(find(x)!=find(y))
		{
			father[find(x)]=find(y);
			tot+=e[i].w;
			d++;
		}
		i++;
	}
	if(d!=n-1) tot=-1;
}
int main(int argc, char *argv[])
{
	int i,j,x,y,z;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++) father[i]=i;
	for(i=1;i<=m;i++)
	scanf("%d%d%d",&x,&y,&z),add(min(x,y),max(x,y),z);
	sort(e+1,e+m+1,cmp);
	Kruskal();
	printf("%lld\n",tot);
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章