Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 50328 | Accepted: 15453 |
Description
Input
Output
Sample Input
1 5 5 A 1 2 D 1 2 A 1 2 D 2 4 A 1 4
Sample Output
Not sure yet. In different gangs. In the same gang.
Source
问题链接:POJ1703 Find them, Catch them
问题简述:(略)
问题分析:
这是一个用并查集来解的问题,略为不同于标准的并查集问题。
总共有n个人,每个人分为自身(1到n)和分身(n+1到2n)两个圈子,自身加入朋友圈,分身加入敌人圈。圈子或为龙帮或为蛇帮。
然后根据不同的message做相应的操作即可。
程序说明:(略)
题记:(略)
参考链接:(略)
AC的C++语言程序如下:
/* POJ1703 Find them, Catch them */
#include
#include
using namespace std;
const int N = 1e5;
int f[N + N + 1];
int n, m;
void Init()
{
for (int i = 1; i <= n; i++) {
f[i] = i;
f[n + i] = n + i;
}
}
int Find(int a) {
return a == f[a] ? a : f[a] = Find(f[a]);
}
int main()
{
int t;
scanf("%d", &t);
while(t--) {
scanf("%d%d%*c", &n, &m);
Init();
while(m--) {
char message;
int a, b;
scanf("%c%d%d%*c", &message, &a, &b);
if(message == 'A') {
int pa = Find(a);
int pb = Find(b);
int pbn = Find(n + b);
if(pa != pb && pa != pbn)
printf("Not sure yet.\n");
else if(pa == pb)
printf("In the same gang.\n");
else
printf("In different gangs.\n");
} else if(message == 'D'){
int pa = Find(a);
int pbn = Find(n + b);
if(pa != pbn) {
f[pa] = pbn;
f[Find(b)] = Find(n + a);
}
}
}
}
return 0;
}