在
ai
和
bi
间连一条权值为
wi
的边,那么问题就转化为从中选几条边并给每条边定向,使每个点的度数不超过
1
<script type="math/tex" id="MathJax-Element-193">1</script>。
容易发现最终答案是一个基环树,求一个最大基环树就好了。
#include<bits/stdc++.h>
using namespace std;
#define N 200010
struct Edge{
int x,y,z;
}e[N];
int Ans;
int i,j,k,n,m,p;
int f[N],x,y;
bool b[N];
inline bool Cmp(Edge a,Edge b){
return a.z>b.z;
}
inline int Find(int x){
return f[x]==x?x:f[x]=Find(f[x]);
}
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
for(i=1;i<=n;i++)f[i]=i;
sort(e+1,e+m+1,Cmp);
for(i=1;i<=m;i++){
x=Find(e[i].x);y=Find(e[i].y);
if(b[x]&&b[y])continue;
if(x==y)b[x]=1;else f[x]=y,b[y]|=b[x];
Ans+=e[i].z;
}
cout<<Ans<<endl;
return 0;
}