poj1703

看了一天的 并查集 路径压缩 做一道简单的题目 
现在对它有了一点认识。
还得继续努力  加油。
//题意  判断两个人是不是属于相同的的犯罪集团.不相同 或 不确定 三种可能。
#include<stdio.h>
#define max 100010
int far[max];
int rank[max];
void inti()
{
    int i;
    for(i=1; i<=max; i++)
    {
        far[i]=i;//自己独自是一棵树;
        rank[i]=0;//开始定义偏移量为0;
    }
}
int find_set(int n)//路径压缩 0表示不同 1表示相同
{
    int tem;
    if(n==far[n])
      return n;
    tem=far[n];//tem 找到前驱。
    far[n]=find_set(tem);
    rank[n]=(rank[tem]+rank[n])%2;
    return far[n];
}
void Union_set(int a,int b)
{
    int aa,bb;
    aa=find_set(a);
    bb=find_set(b);
    far[bb]=aa;
    rank[bb]=(rank[a]+1-rank[b])%2;
}
int  main()
{
    int T;
    int n,m,nn,mm;
    char a;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        inti();
        for(int j=0; j<m; j++)
        {
            getchar();
            scanf("%c %d %d",&a,&nn,&mm);
            if(a=='A')
            {
               //  printf("a=%c\n",a);
                int ans1=find_set(nn);
                int ans2=find_set(mm);
               // printf("1=%d 2=%d\n",ans1,ans2);
                //判断是不是在一个集合里面。
                if(ans1==ans2)
                {
                    if(rank[nn]==rank[mm])
                    {
                        printf("In the same gang.\n");

                    }
                    else
                    {
                      printf("In different gangs.\n");

                    }
                }
                else
                {
                 printf("Not sure yet.\n");
                }
            }
            else
            {
                Union_set(nn,mm);
            }
        }
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值