您的位置:首页 > 其它

ACM_模板_并查集

2016-02-28 22:46 211 查看
有关并查集,最关键的就是两个函数,一个是find(查找),一个是merge(合并),有关并查集的两个函数,也有两种书写的方法,两种书写方法的复杂度是不同的,一种是查找快,合并慢,一种是查找慢,合并快。小编给出的模板则是第二种,因为第二种的使用更加普及,优化起来也有深奥的路径压缩(这里小编就不去介绍了)。

#include <stdio.h>//简易并查集
int set[1002];
int find(int x)
{
int r=x;
while(set[r]!=r)
r=set[r];
return r;
}
void merge(int x,int y)
{
int a,b;
a=find(set[x]);
b=find(set[y]);
if(a!=b)
set[a]=set[b];
}
int main()
{
int n,m,i,x1,x2,count;
while(scanf("%d",&n)&&(n!=0))
{
scanf("%d",&m);
for(i=1;i<=n;i++)
set[i]=i;
while(m--)
{
scanf("%d%d",&x1,&x2);
merge(x1,x2);
}
for(count=-1,i=1;i<=n;i++)
if(set[i]==i)
count++;
printf("%d\n",count);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: