HDU 2473 Junk-Mail Filter (并查集 合并+删除)

来源:互联网 发布:爸爸的网络语 编辑:程序博客网 时间:2024/06/16 10:59

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>

0 0