A bug.s life-并查集

update@2011-09-22
C++语言: 高亮代码由发芽网提供

#define MAX 100010
int father[MAX];
int relation[MAX];
int makeSet(int N){
    //0表示和根节点的关系是 同类
    memset(relation,0,sizeof(relation));
    for(int i = 1;i <= N;i++){
        father[i] = i;
    }
    return 1;
}
int findSet(int x){
    if(x != father[x]){
        int temp = father[x];
        father[x] = findSet(father[x]);
        relation[x] = (relation[temp]+relation[x])%2;
    }
    return father[x];
}
int unionSet(int x,int y){
    int set_x = findSet(x);
    int set_y = findSet(y);
    if(set_x != set_y){
        father[set_x] = set_y;//将x并入y的集合
        relation[set_x] = ((relation[x]+1)%2+ relation[y])%2;
    }
    return 1;
}
///main函数主要部分
        int aa = findSet(a);
        int bb = findSet(b);
        if(aa != bb){
            //不在同一个集合就合并到同一个集合
            unionSet(a,b);
        }
        else if(relation[a] == relation[b]){
            //可以情况出现
            flag = 1;
        }






题目链接:A bug's life
并查集还能这么用,很强大啊。以前写的都是同类之间的合并,而这个是不同类间的合并 同时保存各自和根节点的关系 在findSet回溯的时候更新关系(两种关系就模2,n种关系就模n)....开始觉得非常别扭 写一遍就好了