此题考查并查集用辅助数组标记分类 关键点在于路径压缩时候对于叶子节点的处理,理解了就很容易毕竟AC的人很多
if (ans[Father[x]] == true)
ans[x] = !ans[x];
关键点在这句话
#include<iostream>
#include<fstream>
using namespace std;
int Father[100005];
int Case=0;
bool ans[100005];
int Find(int x)
{
if (Father[x] == x) return x;
int root = Find(Father[x]);
if (ans[Father[x]] == true)
ans[x] = !ans[x];
Father[x] = root;
return root;
}
void Un_tree(int x, int y)
{
int rx = 0, ry = 0;
rx = Find(x);
ry = Find(y);
if (rx == ry)return;
Father[ry] = rx;
ans[ry] = (ans[x]==ans[y])?!ans[ry]: ans[ry];
}
int main()
{
//fstream cin("Text.txt");
cin >> Case;
int n=0, m=0;
int man1, man2;
char C;
while (Case--)
{
cin >> n >> m;
for (int i = 1; i < n+1;i++)
{
Father[i] = i;
ans[i] = false;
}
for (int i = 0; i < m;i++)
{
scanf("%s%d%d", &C, &man1, &man2);
if (C=='A')
{
if (n == 2)
{
cout << "In different gangs." << endl; exit(0);
}
if (Find(man1) != Find(man2))cout << "Not sure yet." << endl;
else if (ans[man1]==ans[man2])
{
cout << "In the same gang." << endl;
}
else
{
cout << "In different gangs." << endl;
}
}
else
{
Un_tree(man1, man2);
}
}
}
return 0;
}