http://blog.csdn.net/dellaserss/article/details/7724401
#include <cstdio>
int pre[1000];
int find(int x)
{
int r = x;
while (pre[r] != r)
r = pre[r];
int i = x, j;
while (pre[i] != r)
{
j = pre[i];
pre[i] = r;
i = j;
}
return r;
}
int main()
{
int n, m;
while (scanf_s("%d", &n) && n != 0)
{
for (int i = 1; i <= n; i++)
{
pre[i] = i;
}
int total = n - 1;
int m, p1, p2, f1, f2;
scanf_s("%d", &m);
while (m--)
{
scanf_s("%d%d", &p1, &p2);
f1 = find(p1);
f2 = find(p2);
if (f1 != f2)
{
pre[f2] = f1;
total--;
}
}
printf("%d\n", total);
}
return 0;
}