poj 1703Find them Catch them

问题描述:



#include 
#include 
#define MAX_N   10005
using namespace std;
int par[MAX_N],a[MAX_N];
//a[0]表示与父节点同gang,a[1]表示与父节点不同gang
void make_set(int n)
{
	for(int i=1;i<=n;i++)
	      {
	      	  par[i]=i;
		       a[i]=0;
	      }
}
int find_set(int x)//路径压缩的同时,修改各节点对父节点的偏移量,因为只有父节点变了
{
	if(par[x]==x)    return x;
	 int  t=par[x];
         par[x]=find_set(par[x]);//x直接指向根节点,路径压缩,x对父节点的偏移量就是就是对根节点的偏移量
	 a[x]=(a[par[x]]+a[x])%2;
     return par[x];
	 //每次跟新新加入的数与父节点的关系,比如,最开始1,2
	 //a[1]=0;a[2]=0;经过unite,1->2,a[1]=1,a[2]=0;再输入1,4,a[1]=1
}
void unite(int x,int y)
{
	int fx=find_set(x);  //
	int fy=find_set(y);
	par[fx]=fy;// 表示每次都更新父节点
	if(a[y]==0)  //表示y 为根节点
	      a[fx]=1-a[x];
	else
	     a[fx]=a[x];
}
int main()
{
	int t,n,m,x,y,fx,fy;
	char S[20];
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		for(int i=1;i<=m;i++)
		{
			scanf("%s%d%d",S,&x,&y);
			if(S[0]=='A')
			{
				fx=find_set(x);
			    fy=find_set(y);
				if(fx!=fy)    printf("Not sure yet.\n");
				else if(a[x]==a[y])
				      printf("In different gangs.\n");
				    else
				       printf("In the same gangs.\n");
			}
			else
			     unite(x,y);
		}
	}
     return 0;
}


你可能感兴趣的:(poj 1703Find them Catch them)