您的位置:首页 > 大数据 > 人工智能

hdu2473Junk-Mail Filter

2014-05-04 21:23 411 查看

题目大意:

将0~n-1之间的数不断的合并到一个集合或者有从集合中分离出来,问到最后这些数位于多少个不同的集合中?

解题思路:

用并查集来做,设立虚拟父节点处理删除问题!。

#include<stdio.h>
#include<string.h>
#define N 2000
#define M 200
int USet[N+M],assist
,Rank
;
bool kind
;
void reset(int n){
int i;
for(i=0;i<n;i++){
USet[i]=assist[i]=i;
}
}
int find(int x){
int i,j=x;
while(j!=USet[j])j=USet[j];
while(x!=j){i=USet[x];USet[x]=j;x=i;}
return j;
}
void UnionSet(int a,int b){
int x=find(a);
int y=find(b);
USet[y]=x;
}
void del(int x,int newset){
USet[newset]=newset;
assist[x]=newset++;
}
int main()
{
int n,m,cas=1,i,ans;
char opera[3];
int a,b,temp;
int newset;
while(scanf("%d%d",&n,&m)&&(n+m)){
memset(kind,0,sizeof(kind));
ans=0;
newset=n;
reset(n);
while(m--){
getchar();
scanf("%s",opera);
if(opera[0]=='M'){
scanf("%d%d",&a,&b);
UnionSet(assist[a],assist[b]);
}else{
scanf("%d",&a);
del(a,newset);
}
}
for(i=0;i<n;i++){
temp=find(assist[i]);
printf("%d**",temp);
if(!kind[temp]){
ans++;
kind[temp]=1;
}
}
printf("Case #%d: %d\n",cas++,ans);
}
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  并查集