OJ题目:click here~~
并查集的删除操作图解,点此转向高手博客~~
<span style="font-size:14px;">const int maxn = 1200000 ;
int rep[maxn] ;
int fa[maxn] ;
int n ;
void init(){
for(int i = 0;i < n;i++){
fa[i] = i ;
rep[i] = i ;
}
}
int father(int u){
if(u == fa[u]) return u ;
else return fa[u] = father(fa[u]) ;
}
void Merg(int u , int v){
int fu = father(u) ;
int fv = father(v) ;
if(fu != fv){
fa[fv] = fu ;
}
}
void Dele(int u){
rep[u] = n ;
fa[n] = n ;
n++ ;
}
int main(){
int m , u , v , T = 1 , N;
char s[10] ;
// freopen("in.txt" , "r" , stdin) ;
while(scanf("%d%d" ,&n , &m)){
if(n == 0 && m == 0) break ;
N = n ;
init();
//memset(rep , -1 , sizeof(rep)) ;
while(m--){
scanf("%s",s) ;
if(s[0] == 'M'){
scanf("%d%d" ,&u ,&v) ;
Merg(rep[u] , rep[v]) ;
}
else if(s[0] == 'S'){
scanf("%d" , &u) ;
Dele(u) ;
}
}
printf("Case #%d: ", T++) ;
set<int> st ;
st.clear() ;
for(int i = 0;i < N;i++)
st.insert(father(rep[i])) ;
printf("%d\n" , st.size()) ;
}
return 0 ;
}
</span>