Assume N (N <= 10^5) criminals are currently in Tadu City, numbered from 1 to N. And of course, at least one of them belongs to Gang Dragon, and the same for Gang Snake. You will be given M (M <= 10^5) messages in sequence, which are in the following two kinds:
1. D [a] [b]
where [a] and [b] are the numbers of two criminals, and they belong to different gangs.
2. A [a] [b]
where [a] and [b] are the numbers of two criminals. This requires you to decide whether a and b belong to a same gang.
1 5 5 A 1 2 D 1 2 A 1 2 D 2 4 A 1 4Sample Output
Not sure yet. In different gangs.
In the same gang.
题目意思:两个帮派,d操作告诉你x,y属于不同阵营。
题目思路:和上题有相似之处,用x+n表示x的敌对阵营,y+n表示y的敌对阵营(给的每句话都是真话)。 操作A,读入两个X,Y。如果x,y同根,说明属于同一阵营。如果x,y+n同根或者x+n,y同根,说明xy属于相反阵营,剩下就是不能判断的情况。
#include <stdio.h> int parent[200000+5]; int find(int x) { return (parent[x]==x)?x:parent[x]=find(parent[x]); } int same(int x, int y) { return find(x)==find(y); } void unite(int x,int y) { x=find(x); y=find(y); if(x==y) return ; else parent[y]=x; } void init(int n) { for(int i=1;i<=n;i++) parent[i]=i; } int main(void) { int n,m; int t; scanf("%d",&t); while(t--) { char str[2]; scanf("%d%d",&n,&m); init(2*n); for(int i=1;i<=m;i++) { int num1,num2; scanf("%s",str); scanf("%d%d",&num1,&num2); if(str[0]=='D') { unite(num1,num2+n); unite(num1+n,num2); } else { if(same(num1,num2)==1) printf("In the same gang.\n"); else if(same(num1,num2+n)==1 || same(num1+n,num2)==1) printf("In different gangs.\n"); else printf("Not sure yet.\n"); } } } }