| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 32514 | Accepted: 10036 |
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.
题意:如果输入D a b 表示a和b不是在一个帮派里面,输入A a b就是询问a和b是不是在一帮派里面。
一般用到并查集都是询问是不是连通什么的,但这道题是考察并查集的另外一项特性,求与祖先节点的距离。
参考 http://www.cnblogs.com/dongsheng/archive/2012/08/08/2627917.html
和2492 几乎一样
代码:
#include <cstdio>
#include <cstring>
const int M = 100100;
int fat[M], ral[M];
int f(int x){
if(fat[x] == x) return fat[x];
else{
int temp = fat[x];
fat[x] = f(fat[x]);
ral[x] = (ral[temp]+ral[x])%2;
return fat[x];
}
}
int main(){
int t, n, m;
scanf("%d", &t);
while(t --){
scanf("%d%d", &n, &m);
int i;
for(i = 0; i < M; i ++) fat[i] = i;
memset(ral, 0, sizeof(ral));
char ch[2];
int a, b;
while(m --){
scanf("%s %d %d", ch, &a, &b);
if(ch[0] == 'A'){
int x = f(a); int y = f(b);
if(x == y){
if(ral[a] == ral[b]){
puts("In the same gang.");
}
else puts("In different gangs.");
}
else printf("Not sure yet.\n");
}
else {
int x = f(a); int y = f(b);
if(x != y){
ral[x] = (ral[a]+ral[b]+1)%2;
fat[x] = y;
}
}
}
}
return 0;
}
poj 1703 Find them, Catch them 【并查集拓展】
原文地址:http://blog.csdn.net/shengweisong/article/details/41687085