ZOJ 3789 Gears (并查集 合并+删除+离根节点的距离)

5 篇文章 0 订阅

OJ题目:click here~~

题目分析:

L a b时,将a和b加入一个集合,且 a ,  b 不同 (a ,b 不同,a , c 不同 那么b c 相同)。

Q a b时,若a和b的权值差为奇数,则方向相反,否则方向相同。 不在一个几个就无法查询。

D a时, 由于被删除的节点的信息以后还会用到,所以就新建一个点作为该点拿出去。

S a时, 直接查询a的祖先节点上储存的集合元素个数。

AC_CODE

const int maxn = 600008 ;
int n , m ;

int rep[maxn] ;
int fa[maxn] ;
int dis[maxn] ;
int sum[maxn] ;
void init(){
    for(int i = 0 ;i <= n + m;i++){
        fa[i] = i ;
        rep[i] = i ;
        sum[i] = 1 ;
        dis[i] = 0 ;//一定要是0.。。为什么呢?
    }
}

int father(int u){
    if(u == fa[u]) return u ;
    int t = father(fa[u]) ;
    dis[u] += dis[fa[u]] ;
    return fa[u] = t ;
}

void Merg(int u , int v){
    int fu = father(u) ;
    int fv = father(v) ;
    if(fu != fv){
        fa[fu] = fv ;//不能fa[fv] = fu  为什么呢??
        sum[fv] += sum[fu] ;
        dis[u] = dis[v] + 1;
    }
}

void Dele(int u){
    int fu = father(rep[u]) ;
    sum[fu]-- ;
    n++ ;
    rep[u] = n ;
    //fa[n] = n ;
}

void Query(int u , int v){
    if(father(u) != father(v))  puts("Unknown") ;
    else if(abs(dis[u] - dis[v])&1) puts("Different") ;
    else puts("Same") ;
}

int main(){
    //freopen("in.txt" , "r" , stdin) ;
    while(scanf("%d%d",&n,&m) != EOF){
        init() ;
        int u , v ;
        char s[10] ;
        while(m--){
            scanf("%s",s) ;
            if(s[0] == 'L'){
                scanf("%d%d",&u , &v) ;
                Merg(rep[u] , rep[v]) ;
            }
            else if(s[0] == 'D'){
                scanf("%d" , &u) ;
                Dele(u) ;
            }
            else if(s[0] == 'Q'){
                scanf("%d%d",&u , &v) ;
                Query(rep[u] , rep[v]) ;
            }
            else if(s[0] == 'S'){
                scanf("%d",&u) ;
                printf("%d\n" , sum[father(rep[u])]) ;
            }
        }
    }
    return 0 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值