标签:
题意:给你t组数据,每组数据给你编号为1-n的坏人,这些坏人要么属于团伙A,要么属于团伙B,然后给你m次操作:
A操作:询问x和y是不是同一个团伙
D操作:告诉你x和y不是同一个团伙
思路:和POJ 1182 食物链是一样的。http://www.cnblogs.com/sevenun/p/5474343.html
AC代码:
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_N = 200005;
int t,n,m,fa[MAX_N],x,y;
char op[2];
int find(int x)
{
if(x == fa[x]) return x;
else return fa[x] = find(fa[x]);
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
if(x == y) return;
fa[x] = y;
}
bool same(int x, int y)
{
return find(x) == find(y);
}
void init()
{
for(int i = 1; i <= n*2; i++)
fa[i] = i, opp[i] = 0;
}
void solve()
{
while(m--)
{
scanf("%s %d %d", op, &x, &y);
if(op[0] == ‘A‘)
{
if(same(x,y))
puts("In the same gang.");
else if(same(x,y+n))
puts("In different gangs.");
else puts("Not sure yet.");
}else
{
unite(x,y+n);
unite(x+n,y);
}
}
}
int main()
{
scanf("%d", &t);
while(t--)
{
scanf("%d %d", &n, &m);
init();
solve();
}
return 0;
}
POJ 1703 Find them, Catch them 并查集
标签:
原文地址:http://www.cnblogs.com/sevenun/p/5484049.html