题意:N个人,M次操作,操作一:A X Y,X,Y不是同一帮派,操作二:D X Y,判断X和Y的关系。
思路:如果X和Y不是同一帮派,那X与Y+N、Y与X+N是同一帮派,如果X与Y不在同一帮派且X与Y+N不是同一帮派则不能确定关系,如果X与Y是同一帮派则输出same那句话,如果X与Y+N是同一帮派则输出different那句话。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m; int pre[200005]; int rank[200005]; char s[5]; void init(int n) { for(int i=1;i<=n;i++) pre[i]=i,rank[i]=0; } int find(int x) { return x==pre[x]?x:pre[x]=find(pre[x]); } void unite(int x,int y) { x=find(x); y=find(y); if(x==y) return ; if(rank[x]<rank[y]) pre[x]=y; else { pre[y]=x; if(rank[x]==rank[y]) rank[x]++; } } int same(int x,int y) { return find(x)==find(y); } int main() { //std::ios_base::sync_with_stdio(false); int t,x,y; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); init(n*2); for(int i=1;i<=m;i++) { scanf("%s%d%d",s,&x,&y); if(s[0]=='A') { if(!same(x,y)&&!same(x,y+n)) //确定是否已有确定的关系 printf("Not sure yet.\n"); else if(same(x,y)) //x与y同帮派 printf("In the same gang.\n"); else if(same(x,y+n)) //x与y不同帮派 printf("In different gangs.\n"); } else { unite(x,y+n); unite(x+n,y); } } } return 0; }