题面链接
题意: 一个图里面,每条边有一个权值Ci ,现在删掉该边就可以得到Ci,但是最终要保证图联通,求最大的能收获的ΣCi
分析:首先可以考虑MST,但是这里又不完全是MST,因为比如一条边的两个点已经合并到了同一个father,但是边权为负,此时我们可以把它留下来,同理若已经构成了一个生成树,那么剩下的边可以任意拿或者不拿,只需要取正值边权即可。
struct node{
ll u,v,w;
}a[manx];
ll f[manx];
bool cmp(node a,node b){
return a.w<b.w;
}
ll find(ll x){
if(f[x]==x) return x;
else return f[x]=find(f[x]);
}
int main(){
ll n,m; cin>>n>>m;
ll su=0;
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=m;i++) {cin>>a[i].u>>a[i].v>>a[i].w;su=su+a[i].w;}
sort(a+1,a+1+m,cmp);
ll ans=0,cnt=1;
ll lcj=0;
for(int i=1;i<=m;i++){
if(cnt==n){
if(a[i].w>0)lcj+=a[i].w;
continue;
}
ll u=a[i].u,v=a[i].v;
ll fu=find(u),fv=find(v);
if(fu==fv){
if(a[i].w>0){
lcj+=a[i].w;
}
continue;
} //continue;
ans+=a[i].w;
++cnt;
f[fv]=fu;
}
cout<<lcj;
return 0;
}