#include <stdio.h>
#include <string.h>
#define N 100001
#define M 1000001
int par[N+M+50];
int repplace[N+50];
int flag[N+M];
int ind;
void init(int n )
{
for(int i=0;i<n;i++)
{
par[i]=i;
repplace[i]=i;
}
ind =n;
}
int findset(int n)
{
if(n==par[n])
return n;
else
return par[n]=findset(par[n]);
}
void unite(int n,int m)
{
int pn=findset(n);
int pm=findset(m);
if(pn!=pm)
par[pn]=pm;
}
void Delete(int n)//删除操作,
{
repplace[n]=ind;
par[ind]=ind;
ind++;
}
int main()
{
int a,b;
char s[3];
int x,y;
int cas=0;
while(scanf("%d%d",&a,&b)==2)//我一直纠结为什莫会WA,判断输入的控制条件错了
{
if(a==0&&b==0)
break;
init(a);
for(int i=0;i<b;i++)
{
scanf("%s",s);
if(s[0]=='M')
{
scanf("%d%d",&x,&y);
unite(repplace[x],repplace[y]);
}
else
{
scanf("%d",&x);
Delete(x);
}
}
memset(flag,0,sizeof(flag));
int ans=0;
for(int i=0;i<a;i++)//判断他们有几个集合
{
int hh=findset(repplace[i]);
if(!flag[hh])
{
flag[hh]=1;
ans++;
}
}
printf("Case #%d: %d\n",++cas,ans);
}
}
其它就不做介绍了,只要会并查集的一般能看懂看懂,看不懂可评论,或发私信。。。。。。Hdu 2473(并查集删除操作) Junk-Mail Filter,布布扣,bubuko.com
Hdu 2473(并查集删除操作) Junk-Mail Filter
原文地址:http://blog.csdn.net/u013076044/article/details/38540933