代码及解释
#include<stdio.h>
#include<string.h>
#include<algorithm>
struct node {
int u,v,val;
} edge[100005];
int set[10005], circle[10005];
int find_f(int x) {
return set[x]==x ? x : set[x] = find_f(set[x]);
}
bool merge_branch(int x,int y){
int a = find_f(x);
int b = find_f(y);
if (a == b) {
if(circle[a] == -1){
circle[a] = 1;
return true;
}
return false;
} else {
if(circle[a] == circle[b] && circle[a] == 1)
return false;
if(circle[a] == 1)
set[b] = a;
else
set[a] = b;
return true;
}
}
int cmp(node a,node b){
return a.val > b.val;
}
int main() {
int n, m;
while(scanf("%d%d",&n,&m)==2 && n && m){
for(int i=0;i<m;i++)
scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].val);
for(int i = 0; i < n; ++i){
set[i] = i;
circle[i] = -1;
}
std::sort(edge,edge+m,cmp);
int ans = 0;
for(int i=0;i<m;i++){
if(merge_branch(edge[i].u, edge[i].v))
ans += edge[i].val;
}
printf("%d\n",ans);
}
return 0;
}