您的位置:首页 > 理论基础 > 数据结构算法

用并查集求解连通分量问题

2011-03-03 09:46 344 查看
   在求解连通分量问题时,之前是用 搜索的思想,就是如果 用几次搜索能遍历整个图,那么连通分量就是n次-1,不过这种有一个问题就是空间消耗太大,我们必须为程序开一个a[n-1][n-1]的存储空间,当图中的结点个数太多时,我们将发现这种算法将是不可取的。。

       于是今天学习了一个新的数据结构就是并查集。。。他的思想是初始化时每个元素都是一个集合。。。之后把具有亲戚关系的元素合并,这样最后还能当得上所谓祖先的元素的元素个数就是有几个家族了,连通分量也就是家族个数减去1了。。这个方法简单而且容易理解是一个不错算法思想,以后要多多学习,今天毕竟才第一次接触、、、下面是用并查集写的求连通分量算法。。

   #include<stdio.h>
int set[1003];
int find(int x)
{
 int r=x;
 while(r!=set[r])
 {
  r=set[r];
 }
 return r;
}
void merge(int a,int b)
{
 int fx=find(a);  //保证每次相连的都是根!!!
 int fy=find(b);
 if(fx!=fy) set[fx]=fy;
}
int main()
{
 int n,m;
 while(1)
 {
  scanf("%d",&n);
  if(n==0) break;
  scanf("%d",&m);
  int i;
  for(i=1;i<=n;i++)
   set[i]=i;
  while(m--)
  {
   int a,b;
   scanf("%d%d",&a,&b);
   merge(a,b);
  }
  int count=-1;//n个集合就有n-1条路;
  for(i=1;i<=n;i++)
   if(i==set[i])
    count++;
   printf("%d/n",count);
 }
 return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息