Find them, Catch them
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 42463   Accepted: 13065

Description

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.

思路

题意:有两个不同的帮派,每个帮派至少有一人。判断两人是否是同一帮派的。
题解:食物链的简化版
方法一:
因为有两个帮派,因此对于每个人只要创建 2 个元素 i - A,i - B,并利用 2*N 个元素建立并查集。
假设 x , y属于不同的帮派,x , y + N 则是同一个帮派,x + N , y 同理。因此只需要将(x , y + N) 和 (x + N , y) 合并即可。
方法二:带权并查集,利用r[ ]数组记录每个元素与其父亲节点的关系。
r[ x ] = 0 代表 x 与其父亲节点是同一个帮派的;
r[ x ] = 1 代表 x 与其父亲节点是敌对帮派的;
一开始每个人都是自己的父亲节点 f[ x ] = x,每个人与自己的关系都是同属于一个阵营 r[ x ] = 0;
1、find( ) 函数寻找根节点的时候要不断更新 r[ ]数组
根据子节点与父节点的关系和父节点和爷爷节点的关系推到子节点和爷爷节点的关系。
很容易通过穷举发现其关系式:a 和 b 的关系为 r1, b 和 c 的关系为r2,则 a 和 c 的关系为: r3 = ( r1 + r2) % 2;
 
(爷爷,父亲) (父亲,儿子) (爷爷,儿子)
0 0 0
0 1 1
1 0 1
1 1 0

2、 Union的时候更新两棵树的关系

定义:fx 为 x的根节点, fy 为 y 的根节点,联合时,使得fa[ fx ] = fy;同时也要寻找 fx 和 fy 的关系,其关系为(r[ x ]  + 1 - r[ y ]) % 2;因为确定了 x 和 y 的关系是 1 ,因此 r[ fy ] = (r[ x ] + 1 - r[ y ]) % 2;
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 100005;
int fa[maxn*3];

int find(int x)
{
	int r = x;
	while (r != fa[r])	r = fa[r];
	int i = x,j;
	while (i != r)
	{
		j = fa[i];
		fa[i] = r;
		i = j;
	}
	return r;
}

void unite(int x,int y)
{
	x = find(x),y = find(y);
	if (x != y)	fa[x] = y;
}

bool same(int x,int y)
{
	return find(x) == find(y);
}

int main()
{
	int T;
	scanf("%d",&T);
	while (T--)
	{
		int N,M,x,y;
		char opt[5];
		scanf("%d%d",&N,&M);
		for (int i = 0;i <= 3*N;i++)	fa[i] = i;
		while (M--)
		{
			scanf("%s %d %d",opt,&x,&y);
			if (opt[0] == 'A')
			{
				if (find(x) == find(y))
					printf("In the same gang.\n");
				else if (same(x,y + N) && same(x + N,y))
					printf("In different gangs.\n");
				else
					printf("Not sure yet.\n");
			}
			else if (opt[0] == 'D')
			{
				unite(x,y + N);
				unite(x + N,y);
			}
		}
	}
	return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 100005;
int fa[maxn],r[maxn];

int find(int x)
{
	if (fa[x] == x)	return fa[x];
	int tmp = fa[x];
	fa[x] = find(fa[x]);
	r[x] = (r[tmp] + r[x]) % 2;
	return fa[x];
}

void unite(int x,int y)
{
	int fx = find(x),fy = find(y);
	if (fx == fy)	return;
	fa[fy] = fx;
	r[fy] = (r[x] + 1 - r[y]) % 2;
}

int main()
{
	int T;
	scanf("%d",&T);
	while (T--)
	{
		int N,M,x,y;
		char opt[5];
		scanf("%d%d",&N,&M);
		for (int i = 0;i <= N;i++)	fa[i] = i,r[i] = 0;
		while (M--)
		{
			scanf("%s %d %d",opt,&x,&y);
			if (opt[0] == 'A')
			{
				if (find(x) == find(y))
				{
					if (r[x] == r[y])	printf("In the same gang.\n");
					else	printf("In different gangs.\n");
				}
				else	printf("Not sure yet.\n");
			}
			else	unite(x,y);
		}
	}
	return 0;
}

  

POJ 1703 Find them, Catch them(带权并查集)的更多相关文章

  1. 【POJ 1984】Navigation Nightmare(带权并查集)

    Navigation Nightmare Description Farmer John's pastoral neighborhood has N farms (2 <= N <= 40 ...

  2. POJ 1984 Navigation Nightmare 【经典带权并查集】

    任意门:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K To ...

  3. [poj 2912] Rochambeau 解题报告 (带权并查集)

    题目链接:http://poj.org/problem?id=2912 题目: 题目大意: n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000) 接下来m行形 ...

  4. poj 1733 Parity game【hash+带权并查集】

    hash一下然后用带权并查集做模2下的前缀和 #include<iostream> #include<cstdio> #include<map> #include& ...

  5. POJ 2492 A Bug's Life 带权并查集

    题意: 思路: mod2 意义下的带权并查集 如果两只虫子是异性恋,它们的距离应该是1. 如果两只虫子相恋且距离为零,则它们是同性恋. (出题人好猥琐啊) 注意: 不能输入一半就break出来.... ...

  6. 【poj 1182】食物链(图论--带权并查集)

    题意:有3种动物A.B.C,形成一个"A吃B, B吃C,C吃A "的食物链.有一个人对N只这3类的动物有M种说法:第一种说法是"1 X Y",表示X和Y是同类. ...

  7. POJ 1703 Find them, Catch them(种类并查集)

    Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 41463   Accepted: ...

  8. 【POJ 1988】 Cube Stacking (带权并查集)

    Cube Stacking Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)id ...

  9. POJ 1703 Find them, Catch them (数据结构-并查集)

    Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31102   Accepted: ...

  10. POJ - 3728:The merchant (Tarjan 带权并查集)

    题意:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. 思路 ...

随机推荐

  1. [转]HDFS中JAVA API的使用

    HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的文件进行操作的过程. 对分HDFS中的 ...

  2. String.Empty、null、“” 区别

    概念准备: 1.引用类型是将对象是实际数据保存在堆中, 将对象在堆中的地址保存在栈中. 2.值类型直接将实际数据存放在堆中,不会将对象在堆中的地址保存在栈中. 一.String.Empty和" ...

  3. ORACLE NUMBER类型Scale为0引发的问题

    今天遇到了一个很有意思的NUMBER类型Scale引发的问题,我用一个简单的测试用例来展示一下这个案例.假如有个TEST的表,有个字段类型为NUMBER,我插入下面两条数据 CREATE TABLE ...

  4. JavaScript中知而不全的this

    都说 JavaScript 是一种很灵活的语言,这其实也可以说它是一个混乱的语言.它把 函数式编程和 面向对象编程糅合一起,再加上 动态语言特性,简直强大无比(其实是不能和C++比的,^_^ ). 这 ...

  5. java Socket编程-基于UDP

    package com.wzy.UDPTest; import java.net.DatagramPacket; import java.net.DatagramSocket; import java ...

  6. web安全性测试用例

    建立整体的威胁模型,测试溢出漏洞.信息泄漏.错误处理.SQL 注入.身份验证和授权错误. 1.   输入验证 客户端验证 服务器端验证(禁用脚本调试,禁用Cookies) 1.输入很大的数(如4,29 ...

  7. 常用IDEA快捷键

    [转]常用IDEA快捷键 阿烈的博客 2013-06-29 72 阅读   最近已经从eclipse转到IntelliJ IDEA,IDEA用起来太顺手了,许多功能正合我意. 看到时光印记写的一篇&l ...

  8. ArcGIS10.2.1精简版、ArcGIS_Desktop10_Tutorial、破解文件等下载地址

    原版ArcGIS for Desktop的ISO文件一般都在4.5G以上,一般人用不上里面很多工具,下载回来又浪费时间,现推出ArcGIS10.2.1精简版(里面只包含主程序.Data Interop ...

  9. linux swap 分区那点事儿

    前言 前段时间在用程序对较大数据进行处理时,发现自己电脑原有内存不够用而经常行卡死,于是想到了利用swap分区来扩容内存的方式.现在做一个简要的总结: swap分区的概念 初试swap分区是在进入实验 ...

  10. 在IIS中实现JSP

    在IIS中实现JSP    IIS本身是不可以支持JSP页面的,但是随着JAVA技术的广泛应用,越来越多的网站采用JAVA技术编写程序,我们根据一些资料和自己的实践经验总结了以下两种JAVA应用服务器 ...