您的位置:首页 > 其它

POJ1703 Find them, Catch them

2012-09-07 09:53 501 查看
原题传送:http://poj.org/problem?id=1703

并查集。

这题更加深了对并查集的理解,以前做过差不多的类似“朋友传递”的题。这道题核心的一句话是:敌人的敌人是朋友。那么假设每个x总有一个敌人(编号为x+n),那么可以把a加入到b的敌人b+n代表的并查集中,把b加入到a的敌人a+n的并查集中。如果find(a)==find(b),那么a和b是同gang;如果find(a)==find(b+n)或者find(b)==find(a+n),那么a和b是不同的gangs;否则,not sure。

View Code

#include <iostream>
#include <stdio.h>
#include <string.h>
#define M 100010
using namespace std;
int f[M << 1];

int find(int x)
{
return x == f[x] ? f[x] : f[x] = find(f[x]);
}

int main()
{
int T, m, a, b, n;
char cmd[3];
scanf("%d", &T);
while (T --)
{
scanf("%d%d", &n, &m);
for (int i = 0; i <= 2 * n; i++)
f[i] = i;
while (m--)
{
scanf("%s%d%d", cmd, &a, &b);
if (cmd[0] == 'D')
{
f[find(a)] = find(b + n);
f[find(b)] = find(a + n);
}
else
{
if(find(a) == find(b))
puts("In the same gang.");
else if(find(a) == find(b + n) || find(a + n) == find(b))
puts("In different gangs.");
else
puts("Not sure yet.");
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: