题意:
警方决定捣毁两大犯罪团伙:龙帮和蛇帮,显然一个帮派至少有一人。该城有N个罪犯,编号从1至N(N<=100000。将有M(M<=100000)次操作。
D a b 表示a、b是不同帮派。
A a b 询问a、b关系 。
题解:
关系并查集,用向量去做这道题,如果不懂的话请看一下我的食物链那个博客http://blog.csdn.net/start_to_crazy/article/details/78767150
这里有个坑点就是n==2的时候询问A和B的关系的时候应该输出In different gangs.因为题目说了显然 一个帮派至少有一人。就没啥坑点了。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=100000+7;
struct node
{
int f,x;
}a[MAXN];
int n,m;
void init()
{
for(int i=1;i<=n;i++)
{
a[i].f=i;
a[i].x=0;
}
}
int find(int p)
{
while(p!=a[p].f)
{
int temp=a[p].f;
a[p].f=find(temp);
a[p].x=(a[p].x+a[temp].x)%2;
p=a[p].f;
}
return p;
}
void Union(int p,int q,int d)
{
int P=find(p);
int Q=find(q);
if(P==Q)
return ;
else
{
a[Q].f=P;
a[Q].x=(a[p].x+2-a[q].x+d)%2;
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init();
for(int i=1;i<=m;i++)
{
int u,v;
char s[5];
scanf("%s%d%d",s,&u,&v);
if(s[0]=='A'&&n==2)
printf("In different gangs.\n");
else if(s[0]=='D')
{
Union(u,v,1);
}
else
{
if(find(u)!=find(v))
printf("Not sure yet.\n");
else
{
if(0==(a[v].x+2-a[u].x)%2)
printf("In the same gang.\n");
else
printf("In different gangs.\n");
}
}
}
}
}