可撤销并查集模板(按秩合并)

大家都很强, 可与之共勉 。

用按秩合并实现,不能路径压缩。

class  UFS  {
private :
    int *fa, *rank ;
    std :: stack < std :: pair < int*, int > > stk ;    
public :
    UFS ( ) {   }
    UFS ( int n )  {
        fa = new int [( const int ) n + 1] ;
        rank = new int [( const int ) n + 1] ;
        memset ( rank, 0, sizeof rank ) ;   
        for ( int i = 1 ; i <= n ; ++ i )    fa [i] = i ;
    }
    inline int find ( int x )  {
        while ( x ^ fa [x] )    x = fa [x] ;
        return x ;
    }
    inline int Join ( int x, int y )  {
        x = find ( x ), y = find ( y ) ;
        if ( x == y )   return 0 ;
        if ( rank [x] <= rank [y] )  {
            stk.push ( std :: make_pair ( fa + x, fa [x] ) ) ;
            fa [x] = y ;
            if ( rank [x] == rank [y] )  {
                stk.push ( std :: make_pair ( rank + y, rank [y] ) ) ;
                ++ rank [y] ;
                return 2 ;
            }
            return 1 ;
        }
        stk.push ( std :: make_pair ( fa + y, fa [y] ) ) ;
        return fa [y] = x, 1 ;
    }
    inline void Undo ( )  {
        *stk.top ( ).first = stk.top ( ).second ;
        stk.pop ( ) ;
    }
} T ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值