标签:des style blog http io ar color os sp
Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6276 Accepted Submission(s): 1981
题意: 给你n封邮件,有两种操作,M x,y 这是说明x,y属于同一类,S x ,则是将x孤立出来, 问最后有多少种类(共同特征)
思路: 并查集应用之点的删除
额,思路就是将这个要删除的尸体,依旧放在原来的集合中,将其灵魂移到新的点上,并用这个点代替死掉的点。
代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 5 const int maxn=1010000; 6 7 int father[maxn]; 8 int rep[maxn]; 9 bool tag[maxn]; 10 int n,m,num; 11 12 void init(){ 13 num=n; 14 for(int i=0;i<n;i++){ 15 father[i]=i; 16 rep[i]=i; 17 } 18 } 19 20 int fin(int x) 21 { 22 int t=x; 23 while(x!=father[x]) 24 x=father[x]; 25 //不用加速,就得无限的tle ,醉了醉了 26 while(t!=x){ 27 t=father[t]; 28 father[t]=x; 29 } 30 return x; 31 } 32 33 void unin(int a ,int b){ 34 35 a=fin(a); 36 b=fin(b); 37 if(a!=b) 38 father[a]=b; 39 } 40 41 void delet(int val){ 42 43 rep[val]=num; 44 father[num]=num; 45 num++; 46 } 47 48 int func_cnt(){ 49 50 int res=0; 51 memset(tag,0,sizeof(bool)*(num+10)); 52 for(int i=0;i<n;i++){ 53 int x=fin(rep[i]); 54 if(!tag[x]){ 55 res++; 56 tag[x]=1; 57 } 58 } 59 return res; 60 } 61 62 int main() 63 { 64 int a,b; 65 char ss[2]; 66 int t=1; 67 while(scanf("%d%d",&n,&m)!=EOF&&n+m){ 68 init(); 69 for(int i=0;i<m;i++){ 70 scanf("%s",ss); 71 if(ss[0]==‘M‘){ 72 scanf("%d%d",&a,&b); 73 unin(rep[a],rep[b]); 74 } 75 else{ 76 scanf("%d",&a); 77 delet(a); 78 } 79 } 80 printf("Case #%d: %d\n",t++,func_cnt()); 81 } 82 return 0; 83 }
hdu 2473 Junk-Mail Filter (并查集之点的删除)
标签:des style blog http io ar color os sp
原文地址:http://www.cnblogs.com/gongxijun/p/4123626.html