/
poj1703.cpp
80 lines (71 loc) · 1.14 KB
/
poj1703.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <cstdio>
#include <cstring>
const int maxn = 100100;
struct Disjoint_Set{
int p[maxn*2];
int r[maxn*2];
int n;
void makeset(int n){
this->n = n;
for(int i=1; i<=n*2; ++i){
p[i] = i;
r[i] = 0;
}
}
int findparent(int x){
if(p[x] != x){
p[x] = findparent(p[x]);
}
return p[x];
}
bool issame(int a, int b){
return findparent(a) == findparent(b);
}
bool isdiff(int a, int b){
return findparent(a+n) == findparent(b);
}
void link(int a, int b){
a = findparent(a);
b = findparent(b);
if(a != b){
if(r[a] < r[b])
p[b] = a;
else{
p[a] = b;
if(r[a] == r[b])
r[a]++;
}
}
}
void dlink(int a, int b){
link(a+n, b);
link(a, b+n);
}
}dset;
int main()
{
int t, a, b;
int n, m;
char buf[32];
scanf("%d", &t);
while(t--){
scanf("%d %d\n", &n, &m);
dset.makeset(n);
for(int i=0; i<m; ++i){
gets(buf);
sscanf(buf+2, "%d %d", &a, &b);
if(buf[0] == 'A'){
if(dset.issame(a, b))
puts("In the same gang.");
else if(dset.isdiff(a, b))
puts("In different gangs.");
else
puts("Not sure yet.");
}
else{
dset.dlink(a, b);
}
}
}
return 0;
}