这个题意虽然过程有些曲折(我仿佛看到了没有工资的人的恶意),反正结果就是要求一个最大生成树,模板套上就可以……
代码在这:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=100010;
int tree[maxn*2];
struct node
{
int x,y,d;
}a[1500010];
int cmp(node a,node b)
{
return a.d>b.d;
}
int find(int x)
{
if(tree[x]==x) return x;
return tree[x]=find(tree[x]);
}
void merge(int a,int b)
{
int fa=find(a);
int fb=find(b);
if(fa!=fb)
{
tree[fa]=fb;
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int k=1;k<=m;++k)
scanf("%d%d%d",&a[k].x,&a[k].y,&a[k].d);
sort(a+1,a+m+1,cmp);
for(int i=1;i<=n;++i)
tree[i]=i;
int sum=0,t=0;
for(int i=1;i<=m;++i)
{
if(find(a[i].x)!=find(a[i].y))
{
merge(a[i].x,a[i].y);
sum+=a[i].d;
t++;
}
}
if(t==n-1) printf("%d",sum);
else printf("-1\n");
return 0;
}