您的位置:首页 > 其它

poj1703 Find them, Catch them(关系并查集)

2016-05-24 21:44 531 查看
http://poj.org/problem?id=1703

题意:给你n个人,m个操作,A x y代表查询x和y是否是同类,有是、否、不确定三种输出;D x y代表确定x和y不同类。

思路:食物链的简化版,那个是三种关系,而这个只有两种。推公式就按照食物链的思路推,纸上比划下就出来了。一旦判断了两个元素的关系,就把他们合并为一个集合。

#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <string.h>
#include <iostream>

using namespace std;

typedef long long LL;

const int N = 100010;
const int INF = 0x3f3f3f3f;

int pre
, r
;

int Find(int x)
{
if(x == pre[x]) return x;
int tmp = pre[x];
pre[x] = Find(pre[x]);
r[x] = (r[x]+r[tmp])%2;
return pre[x];
}

void Union(int x, int y)
{
int rx = Find(x);
int ry = Find(y);
pre[rx] = ry;
r[rx] = (2-r[x]+1+r[y])%2;
}

int main()
{
// freopen("in.txt", "r", stdin);
int t, n, m, x, y;
char s[5];
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
{
pre[i] = i;
r[i] = 0;
}
while(m--)
{
scanf("%s", s);
scanf("%d%d", &x, &y);
if(s[0] == 'A')
{
int rx = Find(x);
int ry = Find(y);
if(rx != ry)
{
printf("Not sure yet.\n");
}
else
{
if(r[x] != r[y]) printf("In different gangs.\n");
else printf("In the same gang.\n");
}
}
else if(s[0] == 'D')
{
Union(x, y);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj