POJ:1703-Find them, Catch them(并查集好题)(种类并查集)
Find them, Catch them
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 49867 Accepted: 15320
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:
D [a] [b]
where [a] and [b] are the numbers of two criminals, and they belong to different gangs.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.
解题心得:
- 有两个帮派,龙帮和蛇帮,有n个罪犯,每个罪犯属于其中一个帮派,有m个操作,第一种就是规定罪犯a,b不属于一个帮派,第二种就是询问罪犯a,b的关系。
- 刚开始看这个题的时候真的很蒙,写得暴力会TLE,后来看大佬说有两种方法,
- 第一种,我把它称为创造镜像(a的镜像是a+n),每个罪犯的镜像和自己属于敌对关系,这样就可以把并查集分成两个部分,两个敌对关系的集合,如果给出a和b是敌对关系,那么就可以合并a和b镜像,合并b和a的镜像。
- 第二种是直接观察关系的转变,在find father和merge时候维护关系,首先使用cm[i]来表示第i个罪犯的帮派(值为0,1),先全部初始化为0,如果a和b是敌对关系,那么cm[b] = (cm[a]+1+cm[b])%2,在find father的时候需要从祖先节点开始从上往下维护,可以发现cm[son] = (cm[son] + cm[father])%2,这里可以仔细想想这个关系,要明白的是我们将所有的帮派初始化都为0。
第一种方法:
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn = 3e5+100;
int father[maxn],n,m,t;
int find(int x){
if(father[x] == x)
return x;
return father[x] = find(father[x]);
}
void merge(int x,int y) {
int fx = find(x);
int fy = find(y);
father[fy] = fx;
}
bool _same(int x,int y) {
return find(x) == find(y);
}
void unite(int x,int y) {
int fx = find(x);
int fy = find(y);
father[fy] = fx;
}
void init() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n*3;i++)
father[i] = i;
}
void Solve() {
for(int i=0;i<m;i++) {
char temp[5];
int a,b;
scanf("%s%d%d",temp,&a,&b);
if(temp[0] == 'A') {
if(find(a) == find(b)) {
printf("In the same gang.\n");
} else if(_same(a,b+n) && _same(a+n,b)) {
printf("In different gangs.\n");
} else
printf("Not sure yet.\n");
} else {
unite(a,b+n);
unite(a+n,b);
}
}
}
int main() {
scanf("%d",&t);
while(t--) {
init();
Solve();
}
return 0;
}
第二种方法:
#include <algorithm>
#include <stdio.h>
#include <cstring>
using namespace std;
const int maxn = 1e5+100;
int father[maxn],n,m,cm[maxn];
void init() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
father[i] = i;
memset(cm,0,sizeof(cm));
}
int find(int x) {
if(x == father[x])
return x;
int temp = father[x];
father[x] = find(father[x]);
cm[x] = (cm[temp]+cm[x])%2;
return father[x];
}
void Unite(int a,int b) {
int fa = find(a);
int fb = find(b);
if(fa == fb)
return;
father[fb] = fa;
cm[fb] = (cm[a] + 1 - cm[b]) % 2;
}
int main() {
int t;
scanf("%d",&t);
while(t--){
init();
while(m--) {
char temp[5];
int a,b;
scanf("%s%d%d",temp,&a,&b);
if(temp[0] == 'A') {
if (find(a) != find(b)) {
printf("Not sure yet.\n");
} else if (cm[a] == cm[b]) {
printf("In the same gang.\n");
} else
printf("In different gangs.\n");
} else {
Unite(a,b);
}
}
}
return 0;
}
POJ:1703-Find them, Catch them(并查集好题)(种类并查集)的更多相关文章
- POJ 1703 Find them, Catch them(确定元素归属集合的并查集)
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 52925 Accepted: ...
- POJ 2236 Wireless Network ||POJ 1703 Find them, Catch them 并查集
POJ 2236 Wireless Network http://poj.org/problem?id=2236 题目大意: 给你N台损坏的电脑坐标,这些电脑只能与不超过距离d的电脑通信,但如果x和y ...
- poj.1703.Find them, Catch them(并查集)
Find them, Catch them Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I6 ...
- POJ 1703 Find them, Catch them(种类并查集)
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 41463 Accepted: ...
- POJ 1703 Find them, Catch them【种类/带权并查集+判断两元素是否在同一集合/不同集合/无法确定+类似食物链】
The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the ...
- 并查集例题01. 种类并查集(poj1733)
题目: http://poj.org/problem?id=1733 题意: 输入n表示有一个长度为n的0,1字符串, m表示接下来有m行输入, 接下来的m行输入中x, y, even表示第x到第y个 ...
- BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]
题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...
- POJ1417 True Liars 并查集 动态规划 (种类并查集)
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ1417 题意概括 有一群人,p1个好人,p2个坏人. 他们说了n句话.(p1+p2<=600,n ...
- [并查集] POJ 1703 Find them, Catch them
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 43132 Accepted: ...
- hdu - 1829 A Bug's Life (并查集)&&poj - 2492 A Bug's Life && poj 1703 Find them, Catch them
http://acm.hdu.edu.cn/showproblem.php?pid=1829 http://poj.org/problem?id=2492 臭虫有两种性别,并且只有异性相吸,给定n条臭 ...
随机推荐
- CF1096C Polygon for the Angle
思路: 要想到正n边形中所有可能的ang为180 * k / n (1 <= k <= n - 2). 根据n = 180 * k / ang, n是大于等于3的整数,并且n >= ...
- 转:Windows任务计划实现自动执行ArcGIS相关功能
今天一不小心点开了Windows任务计划,以前咩有怎么用过,发现还挺好用,于是想到了以前用户的一些问题 1:用户环境使用ArcSDE服务连接,每次运行到一定的负载量(可能是几天),就会很慢,用户就喜欢 ...
- CAD鼠标移动到对象时显示对象内容
//定义事件 Editor ed = doc.Editor; ed.PointMonitor += new PointMonitorEventHandler(ed_Po ...
- senium
http://webdriver.googlecode.com 所以CTRL属于Modifier Key,需要这样写: Actions actionObject = new Actions(drive ...
- 视频SharePoint 2010 大局观 By 陈希章[zt]
SharePoint 2010 大局观 By 陈希章 http://hi.baidu.com/jinzesudawei/item/9d0adace8cbcaf2c47d5c0fc
- Azure 3 月新公布
Azure 3 月新发布:Power BI Embedded,R Server 和 IoT 套件预测性维护预配置解决方案正式发布,ExpressRoute 部署变更,以及计量名称变更 Power BI ...
- Ubuntu18.04中使用中文输入法
如何在ubuntu18.04中设置使用中文输入法 ubuntu 在最新的版本中已经可以不用用户自己单独去下载中文输入法使用了,本次使用为 ubuntu18.04LTS版本(登陆是界面选择的是ubunt ...
- POJ-3614 Sunscreen---贪心+优先队列
题目链接: https://vjudge.net/problem/POJ-3614 题目大意: 有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小 ...
- 【转】android中的Style与Theme
Android默认情况下提供了一些实用的主题样式,比如说Theme.Dialog可以让你的Activity变成一个窗口风格,而Theme.Light则让你的整个Activity具有白色的背景,而不是黑 ...
- centos 7jenkin+git 安装
jenkins+git配置 背景:用git管理源代码,所以需要jenkins安装Git Plugin插件配置 准备: 1.linux环境git客户端 2.jenkins环境 + git plugin插 ...