hdu2473 Junk-Mail Filter(并查集,造假点)
题目
 题意:
    
     
      
       
        m
       
      
      
       m
      
     
    m个操作,每个操作可以把
    
     
      
       
        x
       
       
        ,
       
       
        y
       
      
      
       x,y
      
     
    x,y合并到一个集合,也可以把
    
     
      
       
        x
       
      
      
       x
      
     
    x从它当前集合中删去,成为孤立的点,求最后的不同集合数量
Solution
如果真要从并查集里删一个数,那肯定是很麻烦的,而且我也不会,但是可以把 x x x留着,以后不再调用 x x x,把之后的调用 x x x都改成调用 y y y,其实就相当于删掉了 x x x
Code
#include<bits/stdc++.h>
using namespace std;
const int N=1100002;
int n,m,i,fa[N],id[N],cnt,x,y,rx,ry,cas;
set<int>S;
char s[2];
int find(int x){
	return x==fa[x]?x:fa[x]=find(fa[x]);
}
int main(){
	while (~scanf("%d%d",&n,&m) && n){
		cnt=n;
		for (i=0;i<n+m;i++) fa[i]=i;
		for (i=0;i<n;i++) id[i]=i;
		for (;m--;){
			scanf("%s%d",s,&x);
			if (s[0]=='M'){
				scanf("%d",&y);
				rx=find(id[x]),ry=find(id[y]);
				if (rx!=ry) fa[rx]=ry;
			}else id[x]=cnt++;
		}
		S.clear();
		for (i=0;i<n;i++) S.insert(find(id[i]));
		printf("Case #%d: %d\n",++cas,S.size());
	}
}
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号