/*Pseudoforest...伪森林。。题目说了那么多就是说这个图中最多有一个环..
求所有边和的最大集
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 10001
#define M 100001
int bin[N];int tse;
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];
bin[x]=find(bin[x]);
return 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])//两点都已分别在2个不同的环
return false;
if(flag[fx])//原来已经有一个环了。
bin[fy]=fx;//将fy的集合合并到fx集合
else
bin[fx]=fy;
return true;
}
bool cmp(node a,node b){
return a.w>b.w;
}//贪心排序。。按照从大到小的顺序排序边;
int main(){
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++)
{
tse=i;
if(merge(p[i].x,p[i].y))
{
ans+=p[i].w;
}
}
printf("%d\n",ans);
}
}
hdu 3367 Pseudoforest (并查集)
最新推荐文章于 2012-10-11 16:39:44 发布