在求解连通分量问题时,之前是用 搜索的思想,就是如果 用几次搜索能遍历整个图,那么连通分量就是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;
}