Description
Assume N (N <= 10^5) criminals are currently in Tadu City, numbered from 1 to N. And of course, at least one of them belongs to Gang Dragon, and the same for Gang Snake. You will be given M (M <= 10^5) messages in sequence, which are in the following two kinds:
1. D [a] [b]
where [a] and [b] are the numbers of two criminals, and they belong to different gangs.
2. A [a] [b]
where [a] and [b] are the numbers of two criminals. This requires you to decide whether a and b belong to a same gang.
Input
Output
Sample Input
1 5 5 A 1 2 D 1 2 A 1 2 D 2 4 A 1 4
Sample Output
Not sure yet. In different gangs. In the same gang.
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=100000 +5;
int n,m;
int set[maxn +maxn];
int set_find(int d)
{
if(set[d]<0)
return d;
return set[d]=set_find(set[d]);//路径压缩并查找,是一边查找一边压缩
}
int main()
{
int loop;
int i;
scanf("%d",&loop);
while(loop--)
{
scanf("%d%d",&n,&m);
memset(set,-1,sizeof(set));
for(i=0;i<m;i++)
{
int a,b;
char s[5];
scanf("%s%d%d",s,&a,&b);
if(s[0]=='A')
{
if(set_find(a)!=set_find(b)&&set_find(a)!=set_find(b+n))
//set_find(a)!=set_find(b)是不在同一个帮派中的
//set_find(a)!=set_find(b+n)不在相反的帮派中
printf("%s
","Not sure yet.");
else
if(set_find(a)==set_find(b))
printf("%s
","In the same gang.");
else
printf("%s
","In different gangs.");
}
else
if(set_find(a)!=set_find(b+n)) // set_find(a)!=set_find(b)是不在同一个帮派中的
{
set[set_find(a)]=set_find(b+n);
set[set_find(b)]=set_find(a+n);
}
}
}
return 0;
}