http://blog.csdn.net/dellaserss/article/details/7724401/hdu1232#define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<algorithm> #include<string> #include<cmath> #include<cstdio> using namespace std; int pre[1000]; int find(int x)//查找根節點 { int r = x; while (pre[r]!=r)//返回根節點r { r = pre[r]; } int i=x, j; while (pre[i] != r)//路徑壓縮 { j = pre[i]; pre[i] = r; i = j; } return r; } void join(int x, int y)//判斷x與y是否連通。若是不連通,就把它們所在的連通分支合併起來 { int fx = find(x), fy = find(y); if (fx != fy) { pre[fx] = fy; } } int t[1001]; int main() { int n, m; int x, y; while (scanf("%d", &n) != EOF && n) { for (int i = 1; i <= n; i++) { pre[i] = i; } scanf("%d", &m); while (m--) { scanf("%d%d", &x, &y); join(x, y); } memset(t, 0, sizeof(t)); for (int i = 1; i <= n; i++) { t[find(i)] = 1; } int ans = 0; for (int i = 1; i <= n; i++) { if (t[i]) ans++; } printf("%d\n", ans - 1); } return 0; }