//并查集的简单应用——带路径压缩的并查集 //平摊分析后,每个点只需遍历一次即可建立相应并查集,搜索的复杂度是O(1); //计算不相交集合的个数 #include<iostream> using namespace std; int fa[50010],n,m,ans,vis[50010]; void initSet()//初始化 { for(int i = 1;i <= n;++i) fa[i] = i; } int Find(int x) { int temp_x = x; if(x == fa[x]) return x; else return fa[x] = Find(fa[x]);//路径压缩并查集 } void Union(int x,int y) { x = Find(x); y = Find(y); if(x != y) fa[x] = y; } int main() { //freopen("in.txt","r",stdin); int x,y,caseN = 0; while(scanf("%d%d",&n,&m) && n) { ans = 0; initSet(); memset(vis,0,sizeof(vis)); while(m--) { scanf("%d%d",&x,&y); Union(x,y); } for(int i = 1;i <= n;++i) { if(!vis[Find(i)]) { ++ans; vis[Find(i)] = 1; } } printf("Case %d: %d/n",++caseN,ans); } return 0; }