#include"iostream"
#include"stdio.h"
#include"algorithm"
#include"stdlib.h"
using namespace std;
const int maxn = 50000+5;
int pre[maxn];
void init(int n){
for(int i=1;i<=n;i++) pre[i] = i;
}
int find(int x){
return pre[x] == x ? x : pre[x] = find(pre[x]);
}
bool join(int a,int b){
a=find(a);b=find(b);
if(a==b) return false;
else{
int father = min(a,b);
int son = max(a,b);
pre[son]=father;
return true;
}
}
int main(){
//freopen("input","r",stdin);
//freopen("output","w",stdout);
int n,m;
int Case = 0;
while(
scanf("%d%d",&n,&m)&&(n+m)
)
{
init(n);
int u,v;
for(int i=0;i<m;i++){
scanf("%d%d",&u,&v);
join(u,v);
}
int cnt=0;
for(int i=1;i<=n;i++)
{
if(i==pre[i])
cnt++;
}
cout<<"Case "<<++Case<<":"<<" ";
cout<<cnt<<endl;
}
return 0;
}
2524 克鲁斯卡尔算法
最新推荐文章于 2022-11-06 11:08:28 发布