题目来源: poj 1703
现在做并查集的题目好像越来越有感觉了开心。
思路:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <map>
using namespace std;
const int maxn = 100010;
int n, m;
int father[maxn];
int rel[maxn];
void init()
{
for (int i = 0; i <= n; i++)
{
father[i] = i;
rel[i] = 0;
}
}
int find(int x)
{
if (father[x] == x)
{
return x;
}
else
{
int tf = father[x];
father[x] = find(father[x]);
rel[x] ^= rel[tf];
return father[x];
}
}
void unite(int x, int y, int faX, int faY)
{
if (faX != faY)
{
father[faY] = faX;
rel[faY] = (rel[y] + 1 + rel[x]) % 2;
}
}
int main()
{
int T;
cin >> T;
while (T--)
{
scanf("%d %d",&n,&m);
init();
int u, v;
char c;
getchar();
for (int i = 1; i <= m; i++)
{
scanf("%c %d %d", &c, &u, &v);
int faX = find(u);
int faY = find(v);
if (c == 'A')
{
if (faX != faY)
{
cout << "Not sure yet." << endl;
}
else
{
if (rel[u] != rel[v])
{
cout << "In different gangs." << endl;
}
else
{
cout << "In the same gang." << endl;
}
}
}
else if (c == 'D')
{
unite(u, v, faX, faY);
}
char s = getchar();
}
}
return 0;
}