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);
}
}
合并的时候分情况,是否两个都有环,其中一个有环,两个都没有环
本文详细介绍了并查集算法的基本概念及其在解决图论中寻找环的问题中的应用。通过具体的代码实现展示了如何初始化并查集、查找根节点及进行合并操作,并特别关注了在合并过程中判断是否存在环的情况。
11万+

被折叠的 条评论
为什么被折叠?



