#include <iostream> #include <cstdio> #include <cstring> int n,m,ans,p[1010]; void Make(int *a){for(int i=1;i<=n;i++)p[i] = i;}//每个点都是独立的 int Find(int x){return x==p[x]?x:(p[x]=Find(p[x]));//寻找i的父节点 void Union(int x,int y){p[Find(x)]=Find(y); }//合并x,y int main(){ while (scanf("%d %d", &n, &m) != EOF && n){ Make(p); while(m--){ int x,y; scanf("%d%d",&x,&y); Union(x,y); } ans=0; for(int i=1;i<=n;i++) if(Find(i)==i)ans++; printf("%d\n",--ans); } return 0; }
Make,Find,Union是并查集中最基础三个必要的函数。