思路:
只要两者的关系确定了,就将他们加入一个集合中,另外增加一个表示关系的数组flag,来表示该节点与其父节点的关系,0表示是同一类,1表示是不同团伙。
初始时,集合只有自己一个元素。flag设置为0.
代码如下:
const int M = 100005;
int flag[M], p[M];
int find(int x)
{
int tmp = p[x];
p[x] = (p[x]==x?x:find(p[x]));
flag[x] = (flag[x]==flag[tmp]?0:1);
return p[x];
}
char get_char()
{
char c;
while(1)
{
c = getchar();
if(c=='A'||c=='D') return c;
}
}
int main()
{
int t, n, m, a, b, c, x, y;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &m);
memset(flag,0,sizeof(flag));
for(int i = 0; i <= n; ++i) p[i] = i;
for(int i = 0; i < m; ++i)
{
c = get_char();
scanf("%d %d", &a, &b);
x = find(a);
y = find(b);
if(c=='A')
{
if(x!=y) puts("Not sure yet.");
else if(flag[a]==flag[b]) puts("In the same gang.");
else puts("In different gangs.");
}
else
{
if(x!=y)
{
p[x] = y;
flag[x] = (flag[a]==flag[b]?1:0);
}
}
}
}
return 0;
}
本文介绍了一种使用并查集解决节点间关系判断的问题,包括如何通过并查集维护节点间的同一性和对立性关系,并提供了完整的代码实现。适用于算法初学者及需要处理节点关系的应用场景。

219

被折叠的 条评论
为什么被折叠?



