考虑在 ai 和 bi 之间连一条 wi 的边
这样会形成一个无向图。
如果一个公主嫁给一个王子,就相当于给一条边定向,每个点只有一个入点
如果把结果图拿出来,那么就是一棵基环树。
求个最大基环生成树就好了
以后打CF要先把题看完×2
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int N=200010;
int n,m,fa[N],vis[N];
struct edge{
int a,b,w;
friend bool operator <(edge a,edge b){
return a.w>b.w;
}
}e[N];
vector<int> s[N];
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].w);
for(int i=1;i<=n;i++) fa[i]=i;
sort(e+1,e+1+m);
int ans=0;
for(int i=1;i<=m;i++){
int x=find(e[i].a),y=find(e[i].b);
if(vis[x] && vis[y]) continue;
if(x==y) vis[x]=1;
else fa[x]=y,vis[y]|=vis[x];
ans+=e[i].w;
}
printf("%d\n",ans);
return 0;
}