这道题目oj比较奇怪,用g++提交可以,c++就不行了……
思路:e[]保存敌人
输入时:d,x,y时
fx=find(x),fy=find(y)
如果e[fx]==-1;e[fx]=fy
否则 合并(e[fx],fy);
对fy再做如上操作
View Code
#include<stdio.h>
#include<iostream>
using namespace std;
#define N 100009
int f[N];
int e[N];
int find(int pos)
{
if(f[pos]==-1)return pos;
else f[pos]=find(f[pos]);
}
int un(int a,int b)
{
int fa=find(a),fb=find(b);
if(fa==fb) return 0;
f[fa]=fb;return 1;
}
int main()
{
int T,n,i,j,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
f[i]=-1;
e[i]=-1;
}
int x,y;
int fx,fy;
char zi;
for(i=1;i<=m;i++)
{
getchar();
scanf("%c%d%d",&zi,&x,&y);
fx=find(x);
fy=find(y);
if(zi=='A')
{
if(fx==fy)
{
printf("In the same gang.\n");
}
else if((e[fy]!=-1)&&fx==find(e[fy]))
{
printf("In different gangs.\n");
}
else
{
printf("Not sure yet.\n");
}
}
else
{
if(e[fy]==-1)
{
e[fy]=fx;
}
else
{
un(e[fy],fx);
}
if(e[fx]==-1)
{
e[fx]=fy;
}
else
{
un(e[fx],fy);
}
}
}
}
}