ACM PKU1703 Find them, Catch them

题目描述:http://poj.org/problem?id=1703

这是一道带偏移量的并查集问题,一点点小错误调了我好久,悲剧!奉献代码:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 100000;
int N,M;

bool deff[MAXN+10];
int p[MAXN+10];

void init() //并查集初始化;
{
    for(int i=0; i<=N+1; i++)
    {
        p[i]=i;
        deff[i]=0;
    }
}

int find(const int & x)
{

    if(p[x]==x) return x;
    else
    {
        int px=find(p[x]);      //这里说明一下,deff[]这个数组我存的是不同的时候为0,相同的时候为1;对于在同一个并查集里面的两个元素,首先肯定是要找到当前节点的祖宗;我就是这里写错了一丁点,悲剧了
        deff[x]^=deff[p[x]];    //这里是判断它跟祖宗的关系;
        return p[x]=px;
    }
}

void unionSet(const int & x,const int & y)
{
    int px=find(x);
    int py=find(y);
    if(px==py) return ;
    p[py]=px;
    deff[py]=(deff[x]==deff[y]);    //这里要说明,如果这两个元素的祖宗不同时,他们各自跟祖宗又都不同,那么,他们的祖宗也一定不是同一个帮派的,反之也是一样的。感觉还是没有说清楚,自己画画就知道了。
    return;
}

int main()
{
    freopen("in.txt","r",stdin);
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&N,&M);
        init();
        for(int i=0; i<M; i++)
        {
            char ch[5];
            int x,y;
            scanf("%s%d%d",ch,&x,&y);
            if(ch[0]=='A')
            {
                int px=find(x);
                int py=find(y);
                if(px!=py)printf("Not sure yet.\n");    //不在一个集合就什么都不用说了啦!
                else if(deff[x]==deff[y]) printf("In the same gang.\n");
                else printf("In different gangs.\n");
            }
            else
            {
                unionSet(x,y);
            }
        }
    }
    return 0;
}

  

posted on 2011-08-20 19:51  _Clarence  阅读(130)  评论(0编辑  收藏  举报

导航