码迷,mamicode.com
首页 > 其他好文 > 详细

poj1703 Find them,Catch them 【并查集】

时间:2014-05-21 07:24:40      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:并查集

做过一些的带权并查集,再来做所谓的“种类并查集",发现好像就顿悟了。
种类并查集与带权并查集实质上的差别并不大, 关键的区别就是种类并查集只是带权并查集再弄个%取余操作而已,然后余数就表示他属于哪个种类。
这题只有两个种类,也就是只有0和1两种, 对于两个不同的种类,那么之间的权值是相差1的,所以按照带权并查集的方法做加上1,然后取余2即可。

#include<cstdio>

const int N = 100005;
int n, m, f[N], rank[N];

inline void init(){
    for(int i=1; i<=n; ++i)
        f[i]=i,rank[i]=0;
}

int find(int x){
    if(x==f[x])return f[x];
    int fa=f[x];
    f[x] = find(f[x]);
    rank[x] = (rank[x]+rank[fa])&1;
    return f[x];
}

inline bool Union(int x,int y){
    int a=find(x), b=find(y);
    if(a==b) return false;
    f[b] = a;
    rank[b] = (rank[x]-rank[y]+1)&1;
}

int main(){
    int T,a,b,fa,fb;
    char ch;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%*c",&n,&m);
        init();
        for(int i=0; i<m; ++i){
            scanf("%c%d%d%*c",&ch,&a,&b);
            if(ch=='D'){
                Union(a,b);
            }
            else{
                fa = find(a), fb=find(b);
                if(fa==fb){
                    if(rank[a]==rank[b]) puts("In the same gang.");
                    else puts("In different gangs.");
                }
                else
                    puts("Not sure yet.");
            }
        }
    }
    return 0;
}


 

poj1703 Find them,Catch them 【并查集】,布布扣,bubuko.com

poj1703 Find them,Catch them 【并查集】

标签:并查集

原文地址:http://blog.csdn.net/u011775691/article/details/26421603

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!