#include<stdio.h> int p[1000]; int Find(int i) { return i==p[i]?i:p[i]=Find(p[i]); } void Union(int a,int b) { p[a]=b; } int main() { int n,m,i,s,e,a,b,ans; while(scanf("%d",&n)!=EOF,n) { scanf("%d",&m); for(i=1;i<=n;i++) p[i]=i; while(m--) { scanf("%d%d",&s,&e); a=Find(s); b=Find(e); if(a!=b) p[a]=b; } for(ans=0,i=1;i<=n;i++) if(p[i]==i) ans++; printf("%d\n",ans-1); } return 0; } /************************************************************** Problem: 2203 User: admin Language: C++ Result: Accepted Time:9 ms Memory:1148 kb ****************************************************************/