并查集,一并combine一查find
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
const int INF = 0xfffffff;
const int maxn = 1050;
int n, m, ans;
int father[maxn];
void init(){ //初始化,自己是自己的父亲,一个人一棵树的时候
for(int i = 1; i <= n; i ++){
father[i] = i;
}
}
int find(int a){ //查----找到 a 成员的父亲
int f, s;
f = s = a;
while(father[s] != f){
f = father[s];
s = f;
}
return f;
}
void combine(int a, int b){ //并----将有a的树合并给有b的树
int fa = find(a);
int fb = find(b);
if(fa != fb){
father[fa] = fb;
}
}
int main()
{
//freopen("C:\\open.txt", "r", stdin);
int a, b;
while(cin >> n){
if(n == 0) break;
cin >> m;
init();
for(int i = 0; i < m; i ++){
cin >> a >> b;
combine(a, b);
}
int count = 0;
for(int i = 1; i <= n; i ++){
if(find(i) == i){ //有多少个根就有多少颗树
count ++;
}
}
cout<<count - 1<<endl;
}
return 0;
}