题意:Bessie为别人工作,链接所有的草垛,每条路需要花费一定数目,但是老板并不想给钱,Bessie很生气,想以最大花费情况结束工作。
所以请帮她找到最大生成树。
用kruskal能解决很多问题,这次可以变形即可。
注意:不要忘了-1的情况。
#include<iostream>
#include<algorithm>
#include<cstdio>
#define M 20010
using namespace std;
class kruskal
{
public:
int s,e,v;
}edge[M];
int n,m;
int f[1010],num[1010];
bool cmp(kruskal x,kruskal y)
{
return x.v > y.v;
}
int Find(int x)
{
if(f[x] == x)
return x;
else
f[x] = Find(f[x]);
return f[x];
}
int Union(int x,int y)
{
int a = Find(x);
int b = Find(y);
if(a == b)
return 0;
else if(num[a] >= num[b]){
f[b] = a;
num[a] += num[b];
}
else {
f[a] = b;
num[b] += num[a];
}
return 1;
}
int main()
{
//freopen("in.txt","r",stdin);
cin>>n>>m;
for(int i = 1;i <= n; i++){
f[i] = i;
num[i] = 1;
}
for(int i = 1;i <= m; i++)
cin>>edge[i].s>>edge[i].e>>edge[i].v;
sort(edge+1,edge+m+1,cmp); //按从大到小排列
long long ans = 0,pos = 1;
for(int i = 1;i <= m; i++){
if(Union(edge[i].s,edge[i].e) == 1){
ans += edge[i].v;
pos ++;
}
if(pos == n) //不可忘记
break;
}
if(pos != n)
cout<<"-1"<<endl;
else
cout<<ans<<endl;
return 0;
}