链接:http://poj.org/problem?id=2524
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 21949 | Accepted: 10770 |
Description
Input
Output
Sample Input
10 9 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 10 4 2 3 4 5 4 8 5 8 0 0
Sample Output
Case 1: 1 Case 2: 7
The Submitted Code :
#include <iostream>
#include <cstdio>
#include <cstdlib>
#define MAXN 50005
using namespace std;
int father[MAXN], N[MAXN], MaxNum;
void Make_Set(int n)
{
for(int i=1; i<=n; i++) {
father[i] = i; //使用本身做根;每一个成员开始的父亲节点都为自身;
N[i] = 1;
}
}
int Find_Set(int x)
{
if(x != father[x]) { //合并后树的根是不变的;
father[x] = Find_Set(father[x]);
}
return father[x];
}
void Union_Set(int x, int y)
{
x = Find_Set (x);
y = Find_Set (y);
if(x == y) return ;
if(x >= y) {
father[y] = x;
N[x] += N[y];
MaxNum--;
} else {
father[x] = y;
N[y] += N[x];
MaxNum--;
}
}
int main()
{
int n, m, k = 1;
while(~scanf("%d %d", &n, &m) && n || m) {
Make_Set(n);
MaxNum = n;
for(int i=0; i<m; i++) {
int Md, ME;
scanf("%d %d", &Md, &ME);
Union_Set(Md, ME); //对属于同一个小组的成员集合进行合并;
}
printf("Case %d: %d\n", k++, MaxNum);
}
return 0;
}