【poj 1703】Find them, Catch them 题意&题解&代码(C++)

题目链接:
http://poj.org/problem?id=1703
题意:
输入T表示有T组数据,每组数据输入n,m,表示有n个人,m次询问,每次询问有两种,输入 D (x , y)表示x与y为敌对关系,输入A(x,y)表示询问x与y是什么关系,共有三种,1.朋友(敌人的敌人是朋友),2.敌人,3.不确定。
题解: 
开一些虚点来存敌人,通俗一点就是把x的敌人用并查集全部并在x+n这个点上。
代码:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#define maxn (100005)
using namespace std;
int T,n,m,x,y,fa[2*maxn];
char s[3];
void init()
{
    for (int i=0;i<=2*n+1;i++)
    fa[i]=i;
}
int find(int x)
{
    if (fa[x]==x) return x;
    return fa[x]=find(fa[x]);
}
void unio(int x,int y)
{
    fa[find(x)]=find(y);
    return ;
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        init();
        for (int i=1;i<=m;i++)
        {
            scanf("%s",s);
            scanf("%d%d",&x,&y);
            if (s[0]=='D')
            {
                unio(x+n,y);
                unio(y+n,x);
            }
            else 
            {
                if (find(x)==find(y))
                printf("In the same gang.\n");
                else if (find(x)==find(y+n) || find(y)==find(x+n))
                printf("In different gangs.\n");
                else
                printf("Not sure yet.\n");
            }
        }
    }
}

你可能感兴趣的:(poj,并查集)