题目链接:http://poj.org/problem?id=2377
Description
Realizing Farmer John will not pay her, Bessie decides to do the worst job possible. She must decide on a set of connections to install so that (i) the total cost of these connections is as large as possible, (ii) all the barns are connected together (so that it is possible to reach any barn from any other barn via a path of installed connections), and (iii) so that there are no cycles among the connections (which Farmer John would easily be able to detect). Conditions (ii) and (iii) ensure that the final set of connections will look like a "tree".
Input
* Lines 2..M+1: Each line contains three space-separated integers A, B, and C that describe a connection route between barns A and B of cost C.
Output
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
直接利用Kruskal算法,不过不是优先使用最小权值,而是优先使用最大权值,然后再加上并查集的知识就ok了,基本算是一道比较水的题。
先附上AC代码:
#include
#include
#include
using namespace std;
struct node{
int a,b,val;
}nec[20005];
int s[1010],N,M;
int cmp(struct node A,struct node B){
return A.val>B.val;
}
int find(int x){
if(x==s[x]) return x;
else return s[x]=find(s[x]);
}
void unite(int x,int y){
s[find(x)]=find(y);
}
int main(){
int sum=0;
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
s[i]=i;
for(int i=1;i<=M;i++)
scanf("%d%d%d",&nec[i].a,&nec[i].b,&nec[i].val);
sort(nec+1,nec+M+1,cmp);
int su=0;
for(int i=1;i<=M&&su<=N-1;i++){ //这里利用su<=N-1,可以极大缩减耗时
if(find(nec[i].a)==find(nec[i].b)) continue;
else sum+=nec[i].val,unite(nec[i].a,nec[i].b),su++;
}
/* int plug=0;
for(int i=2;i<=N;i++)
if(find(s[1])!=find(s[i])){
plug=1;
break;
}
if(plug) printf("-1\n");
else printf("%lld\n",sum);*/
if(su!=N-1) printf("-1\n"); //判断是否可以全部连接到,直接这么做就ojbk了,比我上面注释掉的方法好。
else printf("%d\n",sum);
return 0;
}