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