链接:http://poj.org/problem?id=2524
解题思路:
最简单的并查集的应用。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 50010;
int set[MAXN];
int set_find(int p)
{
if(set[p] < 0) return p;
return set[p] = set_find(set[p]);
}
//p并到q中去
void join(int p, int q)
{
p = set_find(p);
q = set_find(q);
if(p != q) set[p] = q;
}
int main()
{
int n, m, t = 1;
while(~scanf("%d%d", &n, &m) && (n || m))
{
memset(set, -1, sizeof(set));
for(int i = 0; i < m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
join(x, y);
}
int ans = 0;
for(int i = 1; i <= n; i++)
{
if(set[i] < 0) ans++;
}
printf("Case %d: %d\n", t++, ans);
}
return 0;
}