POJ - 1703 Find them, Catch them

题目链接:POJ-1703

并查集的变形应用

建立两个数组,a[ ]用来表示双亲结点,b[ ]来表示与x不同的帮派的编号,只需要一个就够了,应为一个通过 函数find可以找的他的parent。

part 1 建立找双亲的函数 findx()

int findx(int x)
{
    if(x!=a[x])   
    {
        a[x]=findx(a[x]);
    }
    return a[x];
}

注:如果x和a[x]相等那么x就是双亲直接返回,否则进行递归,一直到双亲,然后返回a[x]。

part 2 建立对新来结点的建树

void set1(int x,int y)
{
    x=findx(x);
    y=findx(y);
    if(x==y)
        return ;
    a[x]=y;
}

注:通过建立的findx函数找到输入的x,y的双亲如果是一个结点直接返回,否则,将一个作为孩子连上。比如,上面代码中,将x的a[x]=y,x就变成了y的孩子。

part 3 最终代码

#include <iostream>

using namespace std;
#include <cstdio>


int a[100010];
int b[100010];
int findx(int x)
{
    if(x!=a[x])
    {
        a[x]=findx(a[x]);
    }
    return a[x];
}
void set1(int x,int y)
{
    x=findx(x);
    y=findx(y);
    if(x==y)
        return ;
    a[x]=y;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,m;
        cin>>n>>m;
        for(int i=1; i<=n; i++)
        {
            a[i]=i;
            b[i]=0;
        }
        getchar();   //下一个要输入字符
        while(m--)
        {
            char c;
            int x,y;
            scanf("%c %d %d",&c,&x,&y); 
            getchar(); //为下一次做准备。
            if(c=='D')
            {

                if(b[x]==0&&b[y]==0)  
                {
                    b[x]=y;   //注意点1
                    b[y]=x;
                }
                else if(b[x]==0)
                {
                    b[x]=y;
                    set1(x,b[y]);
                }
                else if(b[y]==0)
                {
                    b[y]=x;
                    set1(y,b[x]);
                }
                else
                {
                    set1(x,b[y]);
                    set1(y,b[x]);
                }
            }
            else if(c=='A')
            {
                if(findx(x)==findx(y))
                    cout<<"In the same gang."<<endl;
                else if(findx(x)==findx(b[y]))
                    cout<<"In different gangs."<<endl;
                else
                    cout<<"Not sure yet."<<endl;
            }
        }
    }
    return 0;
}

注意点1:a[x]=y;a[y]=x;

为什么呢?应为题目x,y是不同的帮派,互换以后,当下一个数据输入的时候,寻找双亲findx,a[y]就会走x的值,将新的赋值到x上,而不是y。*

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值