并查集水题
#include <iostream>
using namespace std;
const int maxn=50010;
int tot,m,n;
struct node
{
int rank;
int data;
int parent;
}t[maxn];
void init()
{
for(int i=1;i<=n;i++)
{
t[i].data=i;
t[i].rank=1;
t[i].parent=i;
}
}
int find(int p)
{
if(p!=t[p].parent)
t[p].parent=find(t[p].parent);//路径压缩
return t[p].parent;//易错点
}
void Union(int x,int y)
{
int xp=find(x);
int yp=find(y);
if(xp!=yp)
{
if(t[xp].rank<t[yp].rank)//按秩的大小合并,和上面的路径压缩的作用一样都是提高了查找速度
t[xp].parent=yp;
else
{
t[yp].parent=xp;
if(t[xp].rank==t[yp].rank)
t[xp].rank++;
}
tot--;
}
}
int main()
{
int x,y,amount=0;
while(cin>>n>>m&&!(n==0&&m==0))
{
init();
amount++;
tot=n;
for(int i=0;i<m;i++)
{
cin>>x>>y;
Union(x,y);
}
cout<<"Case "<<amount<<": "<<tot<<endl;
}
return 0;
}