种类并查集(维护敌人的敌人是朋友)、并行-poj1182-食物链 笔记
题意
输入若干组数据,代表着不同动物在食物链的位置(A,B,C),要求出在输入的过程中有多少组数据会与之前矛盾。
思路(借鉴挑战程序设计竞赛)
这题是学并查集时的题,所以用了并查集。
一开始我想的是,设置三个集合,代表ABC三种等级,再人为地选取开头的几个数字,将它们作为这三个集合的祖先。
数据是两两给出的,只要两个数中其中一个所处集合已知,那就可以根据关系判断出另外一个数应该属于哪个集合,然后以此类推将其它元素加入各个集合中,每次加入前再判断一下它们是否已加入即可。
但是完全有可能有不满足我们前提的数据出现(两个数字都未出现过),那这组数据可能就要延后处理。。。总之越想越麻烦,根据我上一次做题的经验(上次做题的笔记),这肯定是出问题了。。。
于是我就去看书了,结果发现它的解决方案和我上一次有神似之处,这里再赘述一下。
上一道题,题目要将一个方格的中心元素填充为相同的数字,当我们要判断是否到达终点时, 由于事先我们并不知道我们应该往其中填充哪个数字,因此我们不能检测某一个数的数量来判断是否到达终点。
因此一个巧妙的解决方法是更改判断标准——统计中心区域相同元素的最大值,一旦这个值达到了中心区域的格子数,那就说明我们完全任务了。
而对于这题,我们事先并不知道动物们属于哪个等级,那我们可以全部都要!
即对每个动物i,创建三个元素iA,iB,iC(iA表示动物i属于种类A),对所有动物则有3 * N个这种元素,我们对它们建立并查集。 这时,并查集的内容也不是某个动物等级,而是按照题目给出的一系列的关系建立起的一个符合条件(A吃B,B吃C,C吃A)的动物的集合。
这样应该也相当于对每个动物的不同状态进行了一遍枚举,因此每个集合的元素也是独特的,即当一个集合包含iA时,iB或iC的加入则是违法的,并且这样建立起的三个集合,从元素的位置和数量上看是完全对称的(判断时会用到)。
于是我们的方法就是
对于第一种同类操作,给出元素x,y,若符合条件,我们便合并xA-yA, xB-yB, xC-yC。
对于第二种捕食操作,给出元素x,y,若符合条件,我们便合并xA-yB, xB-yC, xC-yA。(再次重申,合并代表两个元素满足所给关系以及与集合内其它元素不发生冲突)
而这里的判断条件其实就是合并的元素的补集,即对第一种操作,在合并xA-yA时,条件应该是xA与yB、yC都不在一个集合内,对于不符合条件的,直接ans++。
那合并xB-yB还要另外设置吗,这里便不需要了,因为各个合并操作都是并行进行的,其中一种的状态便可代表全部三种的状态。(可以手动模拟一下这个过程)
出现的问题
程序(思想)不够精炼
如何构建给一个动物建立三种副本?我开始想的是x + 50000,x + 2 * 50000,x + 3 * 50000,这样非常浪费空间。正解应该是,x + N,x + 2 * N,x + 3 * N(总感觉后者才是自然的想法)
条件的判断。我开始没有认识到三种副本之间的对称关系,因此判断条件就比较多,但其实他们都是等价的。
使用并查集之前要初始化,init()
没有这个意识瞪眼看代码怎么也找不着错,找出错来又气又无奈
最后
一篇题解
这篇题解的方法好像和书上的有相通地方,讲的也十分不错,值得多看几回深刻理解 。
种类并查集(维护敌人的敌人是朋友)、并行-poj1182-食物链 笔记的更多相关文章
- 浅谈并查集&种类并查集&带权并查集
并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...
- NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...
- BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]
题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...
- BZOJ 1370: [Baltic2003]Gang团伙(luogu 1892)(种类并查集)
题面: bzoj题面有误,还是看luogu的吧 https://www.luogu.org/problemnew/show/P1892 题解: 种类并查集.. 因为有敌人的敌人是朋友这个条件,所以需要 ...
- 洛谷 P1892 [BOI2003]团伙(种类并查集)
传送门 解题思路 用并查集f存朋友关系,一个数组e存的是敌人关系,是一个辅助数组,所以叫做种类并查集. 当p和q是朋友时,直接合并,但是当是敌人时,需要一些操作. 当p还没有敌人时(即p的敌人是自己) ...
- NOI2001|POJ1182食物链[种类并查集 向量]
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 65430 Accepted: 19283 Description ...
- A Bug's Life(种类并查集)(也是可以用dfs做)
http://acm.hdu.edu.cn/showproblem.php?pid=1829 A Bug's Life Time Limit:5000MS Memory Limit:327 ...
- 种类并查集(洛谷P2024食物链)
题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...
- 洛谷 P1525 【关押罪犯】种类并查集
题解 P1525 [关押罪犯]:种类并查集 前言: 在数据结构并查集中,种类并查集属于扩展域并查集一类. 比较典型的题目就是:食物链(比本题难一些,有三个种类存在) 首先讲一下本题的贪心,这个是必须要 ...
- 2-XOR-SAT (种类并查集)
写了那么多模拟题这题算是最难的了QAQ 好神,,,我于是补了一下并查集.. 并查集很神...... orz 种类并查集...orz 对于维护sat,我们可以这样想: 如果x和y的xor是true,那么 ...
随机推荐
- Docker 安装 MySQL5.6
方法一.docker pull mysql查找Docker Hub上的mysql镜像 #docker search mysql 这里我们拉取官方的镜像,标签为5.6 #docker pull mysq ...
- Windows 10 之 WSL 2
Windows Subsystem for Linux(WSL)无疑大大提升了Windows下程序开发的体验. WSL 2向开发者提供的完整的系统调用兼容,使得许多无法在WSL 1中安装的应用,如Do ...
- form表单提交失败
在使用一个登录/注册模板的时候,发现form表单不了,但是删除模板引用的js后就正常了,查看js文件的源码,有一个 const firstForm = document.getElementById( ...
- Jmeter扩展组件开发(5) - 初始化方法的作用与实现
CODE //URLNAME 就是在图形化界面当中显示的变量名称private static final String URLNAME = "URL";//设置界面当中默认显示的变 ...
- JScript.net
参考网址一.JScript帮助指南 http://doc.51windows.net/jscript5/?url=/jscript5/dir.htm 参考网址二.以下网址列出的类,可以尝试一下,会有意 ...
- ubuntu 安装 gightingale
ubuntu 安装 nightingale 准备情况 # 三台ubuntu机器 192.168.1.91 master 192.168.1.92 node1 192.168.1.93 node2 # ...
- docker network 参数
一. 格式 docker network COMMAND 二.COMMAND 讲解 2.1 .docker network connect 格式 docker network connect [OPT ...
- Python setattr() 函数 ,Python super() 函数: Python 内置函数 Python 内置函数
描述 setattr 函数对应函数 getatt(),用于设置属性值,该属性必须存在. 语法 setattr 语法: setattr(object, name, value) 参数 object -- ...
- AtCoder Beginner Contest 221 A~E题解
目录 A - Seismic magnitude scales B - typo C - Select Mul D - Online games E - LEQ 发挥比较好的一场,就来搓篇题解. F ...
- 无法解析的外部符号之_cvLoadImage,_cvCreateMat,_cvReleaseImage之类
一个错误可能是:附加依赖项少添加了库函数: 还有一个可能是:配置设置错误了,比如该是64位,却设置成win32了.改过来就好了. 要注意opencv的使用中 在Debug.Release模式以及x64 ...