为每个结点设置映射,合并操作在映射上进行,删除操作相当于给当前结点换一个映射。
int n,m;
int mp[MX],f[MX],vis[MX];//mpÐé½áµã
int find(int x)
{
return x==f[x]?x:f[x]=find(f[x]);
}
signed main()
{
int _=0;
while(scanf("%d %d",&n,&m))
{
if(n==0&&m==0) break;
rep(i,n) mp[i]=i,f[i]=i,vis[i]=0;
int k=n;
rpp(i,m)
{
char op[3];scanf("%s",op);
if(op[0]=='M')
{
int x,y;rd(x);rd(y);
int fx=find(mp[x]),fy=find(mp[y]);
f[fy]=fx;
}
else
{
int x;rd(x);
mp[x]=k++;
f[mp[x]]=mp[x];
vis[mp[x]]=0;
}
}
int ans=0;
rep(i,n)
{
int t=find(mp[i]);
if(vis[t]==0) ++ans;
vis[t]=1;
}
printf("Case #%d: %d\n",++_,ans);
}
}