题目思路很清晰:求最大生成树,但是题意中提及,一个点可以有且仅有在一个环内,所以只要加点处理就行了,是一道水题
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <iomanip>
#include <algorithm>
#define N 10005
using namespace std;
typedef long long ll;
int m,n,G[N],num[N];
ll ans;
struct node
{
int a,b,w;
}node1[10*N];
int find_num(int x)
{
return G[x]==x?x:G[x]=find_num(G[x]);
}
bool cmp(node a,node b)
{
return a.w>b.w;
}
void Union(node a)
{
int p=find_num(a.a),q=find_num(a.b);
if(p!=q)
{
int t=num[p]+num[q];
if(t==0)
{
G[p]=q;
ans+=a.w;
}
else if(t==1)
{
G[p]=q;
ans+=a.w;
num[q]=1;
}
}
else if(p==q)
{
if(num[p]==0)
{
num[p]=1;
ans+=a.w;
}
}
}
int main()
{
int i;
while(scanf("%d %d",&m,&n))
{
if(m==0 && n==0) break;
ans=0;
for(i=0;i<m;i++)
{
G[i]=i;
num[i]=0;
}
for(i=0;i<n;i++)
{
scanf("%d %d %d",&node1[i].a,&node1[i].b,&node1[i].w);
}
sort(node1,node1+n,cmp);
for(i=0;i<n;i++)
{
Union(node1[i]);
}
printf("%lld\n",ans);
}
return 0;
}