Find them, Catch them POJ - 1703

The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TWO gangs in the city, Gang Dragon and Gang Snake. However, the police first needs to identify which gang a criminal belongs to. The present question is, given two criminals; do they belong to a same clan? You must give your judgment based on incomplete information. (Since the gangsters are always acting secretly.) 

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. 
Input
The first line of the input contains a single integer T (1 <= T <= 20), the number of test cases. Then T cases follow. Each test case begins with a line with two integers N and M, followed by M lines each containing one message as described above.
Output
For each message "A [a] [b]" in each case, your program should give the judgment based on the information got before. The answers might be one of "In the same gang.", "In different gangs." and "Not sure yet."
Sample Input
1
5 5
A 1 2
D 1 2
A 1 2
D 2 4
A 1 4
Sample 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");             }         }     } }

全部评论

相关推荐

序&nbsp;朋友们,好久不见。&nbsp;笔者在过去消失的五个月里被困在情绪牢笼中过的相当煎熬,一度丢失自己,觉得整个世界都是昏暗的。&nbsp;庆幸的是靠着自己纯硬扛也是走出来了。表达欲再度回归,所以真的很开心还有机会能在再和大家见面。&nbsp;破碎秋招&nbsp;抑郁情绪的引爆点必然是秋招期间遭受的打击了,从去年九月份腾讯转正被告知失败之后就开始疯狂投递简历,每天都在经历:简历挂、一面挂、二面挂、三面挂、HR面挂,每天睁开眼就被无所适从的挫败感包围。&nbsp;秋招的特点是即便流程走到最后一步也不一定会&nbsp;offer,因为还需要进入大池子进行横向对比,俗称泡池子,而这一泡我的大多数面试流程到后面就没了后文,这一度让我感觉非常绝望。我深知自己学历并...
SoNiC_X:我已经工作快2年了,当时高考没考好没去到想去的学校,觉得天要塌了;校招找不到工作,觉得天要塌了;现在工作觉得看不到未来,觉得天要塌了;最近最大的感悟就是:天会一直塌,但是生活也会一直继续下去,还是要调整好自己的心态,不要因为一时的困难把自己困住,要记住完蛋的日子永远在后头
点赞 评论 收藏
分享
03-29 12:10
门头沟学院 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务