【题意】:
有n个黑帮团伙成员,且有两个帮派 。
D x y 表示 x y属于不同的帮派;
A x y 询问 x y的关系。
关系有三种:1.Not sure yet. 2.In different gangs. 3.In the same gangs.
给出m个操作,回答所有询问。
【题解】:并查集题目,可是想不出来,给队友点明了。
对于每个人,拆点x x’。
对于D x y这个操作,把x和y’所在的分量合并,x’和y所在的分量合并。
对于A x y这个询问,
如果find(x) == find(y),则他们属于同一个帮派;
否则,如果find(x) == find(y'),他们属于不同帮派;
否则,他们的关系不确定。
最好在纸上画下图,这样比较容易理解。
【代码】:
1 #include "iostream"
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 #include "cmath"
8 #include "string"
9 #include "cctype"
10 #include "map"
11 #include "iomanip"
12 using namespace std;
13 #define pb push_back
14 #define lc(x) (x << 1)
15 #define rc(x) (x << 1 | 1)
16 #define lowbit(x) (x & (-x))
17 #define ll long long
18 #define maxn 200050
19 int n, m;
20 int fa[maxn];
21
22 void init() {
23 for(int i = 0; i < maxn; i++) fa[i] = i;
24 }
25
26 int find(int x) {
27 if(x != fa[x]) return fa[x] = find(fa[x]);
28 return fa[x];
29 }
30
31 bool un(int a, int b) {
32 a = find(a), b = find(b);
33 if(a == b) return false;
34 fa[a] = b;
35 return true;
36 }
37
38 int main() {
39 int T, a, b;
40 char op[5];
41 scanf("%d", &T);
42 while(T--) {
43 init();
44 scanf("%d%d", &n, &m);
45 for(int i = 0; i < m; i++) {
46 scanf("%s%d%d", op, &a, &b);
47 if(op[0] == 'A') {
48 if(find(a) == find(b)) printf("In the same gang.\n");
49 else if(find(a) == find(b+n)) printf("In different gangs.\n");
50 else printf("Not sure yet.\n");
51 } else {
52 un(a, b + n), un(a + n, b);
53 }
54 }
55 }
56 return 0;
57 }
58