ACM PKU1703 Find them, Catch them
题目描述:http://poj.org/problem?id=1703
这是一道带偏移量的并查集问题,一点点小错误调了我好久,悲剧!奉献代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 100000;
int N,M;
bool deff[MAXN+10];
int p[MAXN+10];
void init() //并查集初始化;
{
for(int i=0; i<=N+1; i++)
{
p[i]=i;
deff[i]=0;
}
}
int find(const int & x)
{
if(p[x]==x) return x;
else
{
int px=find(p[x]); //这里说明一下,deff[]这个数组我存的是不同的时候为0,相同的时候为1;对于在同一个并查集里面的两个元素,首先肯定是要找到当前节点的祖宗;我就是这里写错了一丁点,悲剧了
deff[x]^=deff[p[x]]; //这里是判断它跟祖宗的关系;
return p[x]=px;
}
}
void unionSet(const int & x,const int & y)
{
int px=find(x);
int py=find(y);
if(px==py) return ;
p[py]=px;
deff[py]=(deff[x]==deff[y]); //这里要说明,如果这两个元素的祖宗不同时,他们各自跟祖宗又都不同,那么,他们的祖宗也一定不是同一个帮派的,反之也是一样的。感觉还是没有说清楚,自己画画就知道了。
return;
}
int main()
{
freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&N,&M);
init();
for(int i=0; i<M; i++)
{
char ch[5];
int x,y;
scanf("%s%d%d",ch,&x,&y);
if(ch[0]=='A')
{
int px=find(x);
int py=find(y);
if(px!=py)printf("Not sure yet.\n"); //不在一个集合就什么都不用说了啦!
else if(deff[x]==deff[y]) printf("In the same gang.\n");
else printf("In different gangs.\n");
}
else
{
unionSet(x,y);
}
}
}
return 0;
}
浙公网安备 33010602011771号