题意:就是纯裸的合并和删除一个点,和前两天hdu上的一题一样
解法:设立虚拟节点就好了 我们把点0作为所有只有单身节点的根 然后点0的节点个数当然是1 其他的话全部采用虚拟节点
#include<algorithm>
#include<stdio.h>
#include<cstdio>
using namespace std;
#define maxn 2222222
int f[maxn],co[maxn];
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
int main(){
char op[10];
int n,m,a,b,x,y,_=1;
while(~scanf("%d%d",&n,&m)){
if(!n&&!m)break;
memset(co,0,sizeof co);
memset(f,0,sizeof f);
co[0]=1;
int cnt=n,ans=n;
while(m--){
scanf("%s",op);
if(*op=='M'){
scanf("%d%d",&a,&b);++a;++b;
x=find(a);y=find(b);
if(x!=y||x==0||y==0){
++cnt;--ans;
f[cnt]=cnt;co[cnt]=0;
if(x){
f[x]=cnt;co[cnt]+=co[x];
}else {
f[a]=cnt;co[cnt]++;
}
if(y){
f[y]=cnt;co[cnt]+=co[y];
}else{
f[b]=cnt;co[cnt]++;
}
}
}else if(*op=='S'){
scanf("%d",&a);++a;
x=find(a);
if(co[x]==1||x==0)continue;
ans++;co[x]--;f[a]=0;
}
}
printf("Case #%d: %d\n",_++,ans);
}
return 0;
}