有两个阵营现在给你n个人m条询问语句,A行问你这两个人是不是一个阵营的,D行则表示这两个人不是一个阵营的,不是一个阵营就分别分到不同的集里,unite(a,b+n)和unite(a+n,b);还有注意超时问题,用cin会超时,find函数也要小小加点东西,不然也超时
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN=100000*2+50;
int n,m,t,par[MAXN];
void init()
{
for(int i=0;i<=2*n;i++)
par[i]=i;
}
int find(int x)
{
if(x==par[x])
return x;
else
return par[x]=find(par[x]);//和find(par[x])结果一样但是时间复杂度不一样,不用这个会超时
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
par[x]=y;
return;
}
bool same(int x,int y)
{
return (find(x)==find(y));
}
int main()
{
int t;
char c;
int a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init();
for(int i=0;i<m;i++)
{
getchar();
scanf("%c%d%d",&c,&a,&b);
if(c=='A')
{
if(same(a,b))
printf("In the same gang.\n");
else if(same(a,b+n))
printf("In different gangs.\n");
else
printf("Not sure yet.\n");
}
else
{
unite(a+n,b);
unite(a,b+n);
}
}
}
return 0;
}