转载请注明出处:http://blog.csdn.net/u012860063
直接贴上并查集模板(慎用);
并查集 模板 HDU 1232 #include<cstdio> int father[1005]; int n, m; int i; int find(int x) { return x==father[x]?x:father[x]=find(father[x]); } void init() { for(i = 1 ; i <=n ; i++ ) father[i] = i ; } void Union(int x,int y) { int f1=find(x); int f2=find(y); if(f1!=f2) { father[f2]=f1; } } int main() { int a,b; while(scanf("%d%d",&n,&m)!=EOF && n) { init(); int k=0; for(i = 0 ; i < m ; i++ ) { scanf("%d%d",&a,&b); Union(a,b); } for(i=1 ; i <= n ; i++) if(father[i]==i) k++; printf("%d\n",k-1); } return 0 ; }
下面:
找是否有儿子
#include<stdio.h> #include<string.h> int p[1000],r[1000]; int n, m, i; int find(int x) { return x==p[x] ? x : p[x]=find(p[x]); } void init() { memset(r,0,sizeof(r)); for(i = 1; i <= n; i++) p[i]=i; } void Union(int x,int y) { x=find(x); y=find(y); if(x!=y) p[y]=x; } int main() { int x,y,root; while(scanf("%d%d",&n,&m)!=EOF) { root=0; while(m--) { scanf("%d%d",&x,&y); Union(x,y); r[x]++; } for(i = 1; i <= n; i++) if(r[i]==0) root++; if(r[1]==0) root=0; printf("%d\n",root); } return 0; }