并查集,HDU1232
http://acm.hdu.edu.cn/showproblem.php?pid=1232
模板题
算出共有几个集合就好。并查集其实就是几棵树形成的森林
#include "stdio.h" int bin[1002]; int findx(int x) { int r=x; while(bin[r] !=r) r=bin[r];//当父亲结点不是自身,也就是还没到达根结点的时候就持续往前递推,这里也可以用递归方法,而且也更好:if(bin[r]==r)return r;bin[r]=findx(bin[r]);return bin[x]; return r; } void merge(int x,int y) { int fx,fy; fx = findx(x);//找到根结点 fy = findx(y);//找到根结点 if(fx != fy) bin[fx] = fy;//这个把fx的根结点放在fy的根结点的孩子的位置,表示两个集合合并 } int main() { int n,m,i,x,y,count; while(scanf("%d",&n),n) { for(i=1;i<=n;i++) bin[i] = i; for(scanf("%d",&m);m>0;m--) { scanf("%d %d",&x,&y); merge(x,y); } for(count=-1, i=1;i<=n;i++) if(bin[i] == i)//计算出总共有多少个集合,因为父亲结点指向自己的便是根结点 count ++; printf("%d\n",count); } return 0; }