等有时间补题解
#include <cstdio>
#include <iostream>
using namespace std;
const int MAXN = 100050;
int p[MAXN], ans[MAXN];
int n, m;
int find(int x){
int sum = ans[x];
int y = p[x];
int temp, z;
while (y != p[y]){
sum += ans[y];
y = p[y];
}
while (x != p[x]){
z = p[x];
temp = ans[x];
ans[x] = sum;
p[x] = y;
sum -= temp;
x = z;
}
return y;
}
void Union(int x, int y){
int k = find(x);
if (find(x) == find(y)) return;
p[k] = find(y);
ans[k] = ans[x] + ans[y] + 1;
}
int main(){
int t;
cin >> t;
while (t --){
cin >> n >> m;
for (int i = 0; i <= n; i++) p[i] = i, ans[i] = 0;
while(m --){
char c[2];
int a, b;
scanf("%s%d%d", &c, &a, &b);
if (c[0] == 'D') {
Union(a, b);
}
else {
if (find(a) != find(b)) cout << "Not sure yet." << endl;
else {
if ((ans[a] + ans[b]) % 2 == 0) cout << "In the same gang." << endl;
else cout << "In different gangs." << endl;
}
}
}
}
}