并查集基础代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

#define N 1000  //元素的上限个数
int father[N]; //存储了每个元素父亲的下标
int height[N]; // 存储了某个根的高度

void Init(int n) {
	for (int i = 1; i <= n; i++) {
		father[i] = i;
		height[i] = 1;
	}
}

int Findfather(int x) {
	if (x != father[x]) {
		father[x] = Findfather(father[x]);
	}
	return father[x];
}

void Union(int x, int y,int & num) {
	x = Findfather(x);
	y = Findfather(y);
	if (x != y) {
		num--;
		if (height[x] < height[y]) {
			father[x] = y;
		}
		else if (height[x] > height[y])
			father[y] = x;
		else {
			father[y] = x;
			++height[x];
		}

	}
	
}





int main() {
	int n, m;
	while (cin >> n >> m) {
		if (n == 0) break;

		int num = n;
		Init(n);  //初始化并查集
		for (int i = 0; i < m; i++) {
			int a, b;
			cin >> a >> b;
			Union(a, b, num);

		}
		cout << num-1 << endl;

	}
}