直接合并,合并完以后看一共存在几个集合,我再查有几个集合的时候有点儿蛋疼捉急,哪位大神有好方法告诉一下哈~
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 50010
int p[N];
int find(int x)
{
return p[x] != x ? p[x] = find(p[x]) : x;
}
int main()
{
int n, m;
int x, y;
int r1, r2;
int t = 1;
int rr[N];
while (scanf("%d%d", &n, &m) != EOF)
{
memset(rr, 0, sizeof(rr));
if (n == 0 && m == 0) break;
for (int i = 1; i <= n; i++)
p[i] = i;
while (m--)
{
scanf("%d%d", &x, &y);
r1 = find(x); r2 = find(y);
if (r1 != r2)
p[r2] = r1;
}
for (int i = 1; i <= n; i++)
{
rr[i] = find(i);
}
sort(rr + 1, rr + n + 1);
int ans = 1;
for (int i = 2; i <= n; i++)
if (rr[i] != rr[i - 1]) ans++;
printf("Case %d: %d\n", t++, ans);
}
return 0;
}