http://acm.hdu.edu.cn/showproblem.php?pid=3367
#include<iostream>
using namespace std;
#include<algorithm>
#define N 10001
#define M 100001
int bin[N];
bool flag[N];
struct node{
int x,y;
int w;
}p[M];
void init(int n){
for(int i=0;i<=n;i++)
bin[i]=i;
memset(flag,0,sizeof(flag));
}
int find(int x){
if(bin[x]==x)
return bin[x];
return bin[x]=find(bin[x]);
}
bool merge(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx==fy){
if(!flag[fx]){
flag[fx]=1;
return true;
}
return false;
}
if(flag[fx]&&flag[fy])
return false;
if(flag[fx])
bin[fy]=fx;
else
bin[fx]=fy;
return true;
}
bool cmp(node a,node b){
return a.w>b.w;
}
int main(void){
int n,m;
while(scanf("%d%d",&n,&m),n||m){
init(n);
for(int i=0;i<m;i++)
scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].w);
sort(p,p+m,cmp);
int ans=0;
for(int i=0;i<m;i++)
if(merge(p[i].x,p[i].y))
ans+=p[i].w;
printf("%d\n",ans);
}
}
合并的时候分情况,是否两个都有环,其中一个有环,两个都没有环