#include<stdio.h> #include<string.h> #include<stdlib.h> int n,m,set[1000]; int find(int x)//查找根节点 { return set[x]==x?x:set[x]=find(set[x]);//递归 } void Union(int x,int y)//合并不相等根节点的两个集合 { int a=find(x),b=find(y); if(a!=b) set[a]=b; } int main() { int a,b,x,y,sum; while(scanf("%d%d",&n,&m),n) { for(int i=1;i<=n;i++) { set[i]=i; } for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); Union(a,b); } sum=-1; for(int i=1;i<=n;i++) { if(set[i]==i) { sum++; } } printf("%d\n",sum); } system("pause"); return 0; }