我参照了下边这篇博客:
http://www.voidcn.com/blog/u011008379/article/p-5747778.html
这道题就需要虚点的存在。
比如:输入D 1 2
那么就为2创造一个虚点2',让2‘和1同在一个集合。为1创造一个虚点1’和2同在一个集合。
判断a和b的时候,若a,b同在一个集合,那么a,b在同一个帮派。若a和b‘在一个集合,则a,b在不同的帮派里。
#include <stdio.h>
#define N 100000
int ax[N*2+5];
int nfind(int x);
void get_in(int a,int b);
bool nsame(int a,int b);
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n * 2; i++)
{
ax[i] = i;
}
while (m--)
{
char p[2];
int s, q;
scanf("%s%d%d", p, &s, &q);
if (p[0] == 'D')
{
get_in(s, q + n);
get_in(s + n, q);
}
else
{
if (nsame(s, q))
{
printf("In the same gang.\n");
}
else if (nsame(s, q + n))
{
printf("In different gangs.\n");
}
else
{
printf("Not sure yet.\n");
}
}
}
}
}
int nfind(int x)
{
if (x != ax[x])
ax[x] = nfind(ax[x]);
return ax[x];
}
void get_in(int a, int b)
{
int sa = nfind(a);
int sb = nfind(b);
if (sa != sb)
ax[sa] = sb;
}
bool nsame(int a, int b)
{
int sa = nfind(a);
int sb = nfind(b);
if (sa == sb)
return true;
else
return false;
}