pku 1703 Find them, Catch them(比A bug's life难些)

//方法1,思路更清晰
#include <stdio.h>
#include <string.h>

#define MAXN 100005

int father[MAXN],diff[MAXN];

int find(int x)
{
    int i,t;
    for(i=x; father[i]>0; i=father[i]) ;
    while(x!=i)
    {
        t=father[x];
        father[x]=i;
        x=t;
    }
    return i;
}

int merge(int x,int y)
{
    if(x==-1) return y;
    if(y==-1) return x;
    int fx=find(x),fy=find(y);
    if(fx==fy) return fx;
    if(father[fx]>father[fy])
    {
        father[fy]+=father[fx];
        return father[fx]=fy;
    }
    else
    {
        father[fx]+=father[fy];
        return father[fy]=fx;
    }
}

inline void divide(int i,int j)
{
    int fi=find(i),fj=find(j);
    int x=merge(diff[fi],fj);
    int y=merge(fi,diff[fj]);
    //x,y都是根,diff[]总是对根进行处理
    diff[x]=y;
    diff[y]=x;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int N,M,i,j;
        char ch;
        scanf("%d %d",&N,&M);
        getchar();
        memset(father,-1,sizeof(*father)*(N+1));
        memset(diff,-1,sizeof(*diff)*(N+1));
        while(M--)
        {
            scanf("%c %d %d",&ch,&i,&j);
            if(ch=='D')
            {
                divide(i,j);
            }
            else
            {
                int fi=find(i),fj=find(j);
                if(fi==fj) printf("In the same gang.\n");
                else if(fi==diff[fj]) printf("In different gangs.\n");
                else printf("Not sure yet.\n");
            }
            getchar();
        }
    }
    return 0;
}

 

//************************************************************************************
//方法2:

 

#include <stdio.h>
#include <string.h>

#define MAXN 100005

int father[MAXN],opp[MAXN];

int find(int x)
{
    int i,t;
    for(i=x;father[i]>0;i=father[i]) ;
    while(x!=i)
    {
        t=father[x];
        father[x]=i;
        x=t;
    }
    return i;
}
void merge(int x,int y)
{
    int fx=find(x),fy=find(y);
    if(fx==fy) return;
    if(father[fx]>father[fy])
    {
        father[fy]+=father[fx];
        father[fx]=fy;
    }
    else
    {
        father[fx]+=father[fy];
        father[fy]=fx;
    }
}

int main()
{
    int T,k;
    scanf("%d",&T);
    for(k=0;k<T;k++)
    {
        int N,M,i,j;
        char ch;
        scanf("%d %d",&N,&M);
        getchar();
        memset(father,-1,sizeof(*father)*(N+1));
        memset(opp,-1,sizeof(*opp)*(N+1));
        while(M--)
        {
            scanf("%c %d %d",&ch,&i,&j);
            if(ch=='D')
            {
                if(opp[i]==-1) opp[i]=j;
                else merge(opp[i],j);

                if(opp[j]==-1) opp[j]=i;
                else merge(opp[j],i);
            }
            else
            {
                int oi=opp[i],oj=opp[j],fi=find(i),fj=find(j);
                if(fi==fj) printf("In the same gang.\n");
                else if( (oi!=-1 && find(oi)==fj) || (oj!=-1 && find(oj)==fi) ) //另一个在自己的对方gang中(即不在自己的gang中)
                    printf("In different gangs.\n");
                else printf("Not sure yet.\n");
            }
            getchar();
        }
    }
    return 0;
}

 

posted @ 2010-08-24 23:30  菜到不得鸟  阅读(174)  评论(0)    收藏  举报