题解:
并查集的基本应用
并查集:find和merge两个基本方法
注意每次查找的都是根的值,每次合并都是将根的值赋值为新的集合
#include <stdio.h>
#include <iostream>
using namespace std;
int fa[50005],n,m,p;
int find(int x){
if(fa[x]==x)return x;
else return find(fa[x]);
}
void merge(int a,int b){
int a1=find(a);
int b1=find(b);
if(a1!=b1){
n--;
fa[b1]=a1;
}
}
int main(){
p=1;
cin>>n>>m;
while(!(n==0&&m==0)){
for(int i=0;i<n;i++){
fa[i]=i;
}
int x,y;
for(int i=0;i<m;i++){
cin>>x>>y;
merge(x-1,y-1);
}
cout<<"Case "<<p<<": "<<n<<endl;
p++;
cin>>n>>m;
}
}