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; }