POJ 1703

poj1703 Find them, Catch them 这是题目: 3:Find them, Catch them 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 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, G 阅读详情

题目链接:http://poj.org/problem?id=1703

题目大意:两组犯罪团体,抓住N个人,他们属于且唯一属于两组犯罪团体之一。然后,给你M条信息,也分两类。D类信息说明id0和id1是不同组织的,A类信息是询问id0和id1的关系,包括不同组织,相同组织和无法判断。


解题思路:

       并查集,但简单并查集思路与该题目不符合。因为简单并查集会告诉你两个目标是相同组织的,此题恰好相反。但是,两人属于不同组织说明他们是有联系的,也就是说1D2, 2D3,那么1和3的关系是可以推断出来的,也就可以将1,2,3理解为一个集合(暂且叫做不等集合,里面包含许多不等关系,这些不等关系可以推出相等关系)。

       那么D信息表明id0所属的集合与id1所属的集合应该是同一个不等集合的(合并)。然而,在并查集中,不等集合都需要一个根作为代表。这里谁做根都可以,但是必须让根的父节点等于根,C2G[x]=x。 这里可能会有疑问:不是不等集合吗?那么C2G[i]和i的关系到是什么?

       C2G[i] 表示i的根,但是在不等集合里是无法确定C2G[i]与i的组织关系。因此,另外用rank记录i,rank[i]表示i和C2G[i]的组织关系,0代表相同,1代表不同。

#include<stdio.h>

const int MAX_N = 100001;
int C2G[MAX_N];
int Rank[MAX_N];
int T, N, M;

void init(){

	for(int i = 1; i <= N; i++){
		C2G[i] = i;
		Rank[i] = 0;
	}
	return;
}

int Find(int x){
	if( x == C2G[x] ){
		Rank[x] = 0;
		return x;
	}

	int fx = Find(C2G[x]);
	Rank[x] = (Rank[x] + Rank[C2G[x]]) % 2;
	C2G[x] = fx;
	
	return C2G[x];
}

void Union(int x, int y){
	int fx = Find(x);
	int fy = Find(y);

	if( fx == fy ){
		return ;
	}
	else{
		C2G[fx] = fy;
		Rank[fx] = (Rank[x] + Rank[y] + 1) % 2;
	}

	return;
}

int main(){

	scanf("%d", &T);
	for(int i = 0; i < T; i++){
		scanf("%d%d", &N, &M);
		
		init();
		char str;
		int id0, id1;

		for(int j = 0; j < M; j++){
			scanf("\n%c%d%d", &str, &id0, &id1);
			if( str == 'A' ){
				int FatherId0 = Find(id0);
				int FatherId1 = Find(id1);
				if( FatherId0 == FatherId1 ){
					if( Rank[id0] == Rank[id1] ){
						printf("In the same gang.\n");
					}
					else{
						printf("In different gangs.\n");
					}
				}
				else{
					printf("Not sure yet.\n");
				}
			}
			else{
				Union(id0, id1);
			}
		}
	}

	return 0;
}


poj 1703 罪犯的帮派 并查集基础题目 http://blog.sina.com.cn/s/blog_6635898a0100kco0.html 这里用opp数组表示不在一个帮派的编号(2值)感觉思路比较清晰 #include #include #include #include #include #include #include #include #include #incl 阅读详情

相关推荐

poj 1703(并查集)

题意:有n个人和两个阵营,给出两种操作,A a b ,询问a和b的是否在同一个阵营,如果有人未加入任何阵营输入不确定。D a b,让a和b成为不同阵营的。 题解:两种做法。 一种是把并查集扩大一倍,先给每个人一个假定的敌人,然后有D操作时把敌人加入到假定敌人的集合中,A操作判断a和b是否在同一个集合,如果不在判断对方是否在自己假定敌人的集合中,在就是敌人,否则是不确定。#include <std

俯瞰风景 788

POJ - 1703 种类并查集 带权并查集

题目 题解思路 因为是提示不同帮派,所以不能用普通的并查集来解决。 注意的 点就是 不同帮派的人的不同帮派就是同一个帮派的。 很容易想到带权并查集来解决,两个状态0 1 代表相同和不同帮派。 这里还有种用朴素并查集实现的种类并查集可以解决这种问题。 开两倍的空间,利用n外的数来附加n内的数的状态。 记 a b c b 相连 我们不直接让 a b 相连 ,让 a和 b+n b和 a+n相连。 c b+n c+n b相连 这时就会有路径压缩使得a和c相连了,这样说明a c有间接的关系。 AC代码 普通并查

从你的全世界路过 343

Aruba CX交换机VSX配置实战:如何避免脑裂导致的网络中断(含详细命令)

本文提供Aruba CX交换机VSX配置的实战指南,重点讲解如何通过构建高可靠的ISL链路聚合与独立隔离的Keepalive链路,有效避免网络脑裂风险。文章包含详细的命令步骤,从基础配置到高级故障排查,帮助网络工程师构建坚如磐石的高可用核心网络,确保业务流量零中断。

weixin_29231725的博客 138

poj1703(并查集—“食物链”的简化版)

http://poj.org/problem?id=1703poj1703 点击打开链接)

Acmer_future_victor的博客 496

POJ 1703 (多集合 并查集

/* 解决这题的关键在于,维护多种集合的关系;由于给的关系是两对立的,就需要第一个元素的反面是第二个元素的集合, 第二个元素的反面是第一个元素的集合。有利于判断两个元素是同一集合,还是不能判断; 比如,输入1 5 5 A(1,2) ;这时,1的反面是6 ,2的反面是7;他们的集合各不相同,所以不能判断; 再输入D(1,2); 由于我上面定的规矩,1 和 7 同一个集合,2 和 6 在一

julicliy的博客 366

POJ1703-Find them, Catch them

这是一道类似于食物链的并查集题目。 #include const int maxn = 10e5 + 10; int par[2 * maxn]; int rk[2 * maxn]; void init(int n) { for (int i = 0; i < 2 * n; i++) { par[i] = i; rk[i] = 0; } }

Collider 337

【种类并查集】 -- poj1703

题目来源: poj 1703 现在做并查集的题目好像越来越有感觉了开心。 思路: #include <iostream> #include <algorithm> #include <cstdio> #include <map> using namespace std; const int maxn = 100010; int n, m; int f...

圣托里尼的日落啊~的博客 219

poj 1703

http://poj.org/problem?id=1703 rank 用于记录祖先的等级 opp 用于记录敌人。。 1 #include <iostream> 2 #include<cstdio> 3 using namespace std; 4 int f[100005]; 5 int rank[100005],opp[100005...

a18865477815的博客 161

POJ1703Find them, Catch them 【种类并查集

题目链接:http://poj.org/problem?id=1703 题目大意:给n个人,m次询问。A代表询问a, b之间的关系,D代表给出a, b属于不同的帮派。 我的想法: 太菜了,上课的时候没想到这种方法。 思路: 1.感觉有点像2-sat的思想,对于D给出的a, b两人属于不同帮派。我们就将a于b的对立点用并查集维护在一个集合中,也将b于a的对立点连通。 2.查询时...

a6334167的博客 172

POJ1703 并查集

POJ1703题目大意:警察抓获N个罪犯,这些罪犯只可能属于两个团伙中的一个,现在给出M个条件(D a b表示a和b不在同一团伙), 对于每一个询问(A a b)确定a,b是不是属于同一团伙或者不能确定。 这道题我用了两个并查集,把每个罪犯复制出两个来。一个是原来的,一个对称后的,以判断a b的相对团伙。 同一个集合表示可以有一个罪犯所述团伙推出其他罪犯所属团伙,用于判断是否能确定。 代码:

NEPTUNEl123的博客 483

poj1703 Find them Catch them

http://www.elijahqi.win/2018/01/12/poj1703-find-them-catch-them/ ‎ 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

Elijahqi 381

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

题目地址:POJ 1703 种类并查集水题。 代码如下: #include #include #include #include #include #include #include #include #include #include #include using namespace std; int bin[600000], rank[600000]; int f

scf0920 1273

poj 并查集 - 1703 Find them, Catch them

并查集题目,点击打开链接这位博主对并查集的介绍可谓是很详细易懂了,并的意思就是将两个不同类别的集合合并到一起,类似于两棵树合并;查的意思就是找到这个点所属集合的根节点。 这道题目里里面有两个帮派,我们需要判断抓到的两个罪犯,是否属于一个帮派?D [a] [b] 说明a,b不是一个帮派,A[a][b]时需要判断这两个人是不是一个帮派的。 这里在并查集模板里加入一个ranks数组,

不要说话的博客 570

poj1703 题解

并查集 每个联通图内的元素之间都有相对关系rank,关系rank差1说明元素在不同的集团,rank相同说明在同一个集团。 询问a,b结点的关系的时候,当a,b不在一个联通图是关系未确定 a,b在一个联通图则比较rank 代码: #include #include #include #include #include #include using namespace std;

leader880022的专栏 488

POJ-1703 并查集

并查集的经典入门题。 思路:将有联系的两个节点,节点小的看成大的父节点,每次加入节点,在修改父节点时用rank[i]记录节点i的状态。即:rank[1]表示有关系,rank[0]表示无关系。 #include #include #include using namespace std ; const int N=100005; int father[N]; int rank[N];

ZXLS-ZMR的专栏 737

poj 1703 并查集解决分组问题

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 ide

winycg的博客 734

【微信读书】数据内容接口逆向解析实战:从请求捕获到文本提取

本文详细解析了微信读书网页版数据内容接口的逆向工程实战过程。通过浏览器开发者工具捕获网络请求,定位关键API接口,并深入JavaScript代码分析数据解析逻辑,最终实现从请求模拟到文本提取的完整流程。文章旨在技术学习,探讨Web应用数据交互原理,帮助开发者理解现代前端数据流与编码机制。

game4的博客 374

表格DFMEA案例分析-结构分析功能分析和失效分析_新能源检测技术材料化学元器件汽车电子热分析实验室仪器温度.doc

新能源检测技术材料化学元器件汽车电子热分析实验室仪器 相关技术文档

上一篇: 河内塔, 平面上的直线和约瑟夫问题的公式列表和出处
下一篇: KMP字符串匹配算法的伪代码
沈三水
博客等级 码龄13年 8粉丝 45原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值