雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

有两个种类的并查集——pku1703

Posted on 2011-02-24 21:40  huhuuu  阅读(309)  评论(0编辑  收藏  举报
这道题目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);
}
}
}
}
}