POJ-1703 Find them,Catch them(数据结构+并查集)

http://poj.org/problem?id=1703

题意:

Tadu City里面有两个黑帮团伙Gang Dragon和Gang Snake,一共有n名团伙成员(还不知道属于这两个黑帮的哪一个)。现在警察局有一些信息,每条信息包含2个人编号,能否确定他们属于同一帮派。

思路:

并查集习题,

只要两者的关系确定了,就将他们放入同一集合内,而另外增加一个表示关系的数组rela[]来表示该结点与其父节点的关系,0表示同一类,1表示不同团伙。

初始集合时只有自己一个元素,rela设置为0.

代码:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iomanip>
#include<algorithm>
#include<string.h>
#include<queue>
#include<cmath>
#include<stack>

using namespace std;
const int maxn=1e5+10;
const int inf=1e10;
typedef long long ll;

int p[maxn],rela[maxn];

int T,N,M,a,b;
char flag;

void make()
{
    for(int i=1; i<=N; i++){
        p[i]=i;
        rela[i]=0;
    }
}
int find(int x)
{
    int temp=p[x];
    if(x==p[x])
     return x;
    p[x]=find(p[x]);
    rela[x]=(rela[x]==rela[temp])?0:1;
    return p[x];
}
void UnionSet(int x,int y,int px,int py)
{
    p[px]=py;
    rela[px]=(rela[x]==rela[y]?1:0);
}

int main()
{
    cin>>T;
    while(T--)
    {
        cin>>N>>M;
        make();
        while(M--)
        {
            scanf("\n%c%d%d",&flag,&a,&b);
            int pa=find(a),pb=find(b);
            if(flag=='A'){
                if(pa!=pb){
                    cout<<"Not sure yet."<<endl;
                    continue;
                }
                if(rela[a]==rela[b]){
                    cout<<"In the same gang."<<endl;
                    continue;
                }
                cout<<"In different gangs."<<endl;
                continue;
            }
            if(flag=='D')
             if(pa!=pb) UnionSet(a,b,pa,pb);
        }
    }
    return 0;
}

 

posted on 2021-01-31 17:51  mmn  阅读(79)  评论(0编辑  收藏  举报