![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【并查集】
张松超
这个作者很懒,什么都没留下…
展开
-
POJ ~ 2912 ~ Rochambeau (枚举+并查集)
题意:你在看N个小孩在玩石头剪刀布,编号为0 ~ n-1,每个小孩会一直出同一种手势(如果出石头就一直出石头),但是这些小孩中有一个法官,法官想出什么手势就出什么手势。他们总共玩了M局游戏(1~M),ab表示a赢了b,a=b表示平局。问你能否发现这些孩子中的法官,如果发现了是在第几局游戏中发现的?在解释一下问的内容:1.”Impossible“谁当法官都不可以使全部对局成立。2.”Pl原创 2018-01-21 13:35:56 · 417 阅读 · 0 评论 -
UVALive ~ 3644 ~ X-Plosives (并查集)
题意:有若干个由两种元素组成的简单化合物,现在把它们装进车里,如果车上有恰好有k种简单化合物并且恰好有k种元素的话,那么就会引发爆炸,所以车上的化合物必须避免满足这个条件。现在用一个整数表示元素,每行两个整数表示一个简单化合物,按顺序给出,求出这些化合物中有多少个化合物不能装进车。以-1结束,多组输入输出。思路:并查集维护就OK啦,在一个并查集中的就不装车,ans++。#include<bi...原创 2018-05-03 21:35:13 · 213 阅读 · 0 评论 -
PAT ~ L2-010. 排座位 (并查集)
思路:我们可以发现,敌对关系并不影响朋友关系,所以我们可以把这两种关系分开去维护。因为朋友的朋友是朋友,所以用并查集维护朋友关系。因为只有直接敌对的两个人才真的敌对,所以二维数组维护敌对关系。然后按要求输出即可。#include <bits/stdc++.h>using namespace std;const int MAXN = 105;int N, M, K, f[MAXN]...原创 2018-03-20 21:19:25 · 296 阅读 · 0 评论 -
PAT ~ L2-007. 家庭房产 (并查集)
思路:一看什么几个家庭什么的,就想到了用并查集去维护家庭关系。输入的处理有点麻烦,题目中说了每个人的编号是一个不重复的四位数字,所以我们可以借鉴 PAT ~ L2-002. 链表去重 (思路 + 模拟)这道题目,直接把数组下标就作为是哪个人。每个人需要记录它属于哪个家庭(即编号最小的人的编号),家庭总人数,家庭总房产套数,家庭总房产面积。因为人均过程中有精度损失,所以先保存总的。合并过程中注意要合...原创 2018-03-17 17:21:39 · 461 阅读 · 0 评论 -
POJ ~ 2492 ~ A Bug's Life (带权并查集)
题意:T组测试数据,每组数据有一个N,M表示N个人和M个关系,下面M行为关系,每组关系有两个数字a,b表示a喜欢b,问有没有同性恋?思路:带权并查集。权值0表示和父节点为同性,1为异性。//#include#include#includeusing namespace std;const int MAXN = 40005;int n, m, f[MAXN], w[MAXN];b原创 2018-01-19 21:50:42 · 281 阅读 · 0 评论 -
POJ ~ 1984 ~ Navigation Nightmare (带权并查集,多权值)
题意:有N个地点,M组关系,每组关系有三个数字a,b,d和一个字符dir。表示a在b的dir方向的d米处。然后有k次询问,每次询问包括三个数字,a,b,times,问在第times秒(也就是只有上面关系中的前times行)的时候a到b的曼哈顿距离为多少,没有输出-1。k次询问的times保证从小到大。思路:带权并查集,只不过有两个权值,一个东西方向(以东为正方向),一个南北方向(以北为正方向)。因原创 2018-01-19 17:14:20 · 425 阅读 · 0 评论 -
POJ ~ 1733 ~ Parity game (带权并查集+map离散化)
题意:一个长度为N的01串,M句话,每次告诉你a~b区间内有奇数个或者偶数个1,问第一个与前面矛盾的位置在哪,输出他的上一个的位置,没有错误输出M。思路:因为N为10^9,明显开不了那么大的数组,而M只有5000,也就是说中间会有很多数字没有。我们就想到了离散化,只保存有的数字,没有的数字不开辟空间。对于每个数字需要保存两个值,一个为父节点,一个为权值。用map >即可,第一个int表示下标,pa原创 2018-01-19 14:05:59 · 529 阅读 · 0 评论 -
POJ ~ 1456 ~ Supermarket (贪心+并查集)
题意:有N种商品,每种商品有价值和保质期。物品在保质期时间内卖出去才会有回报。问怎么卖才能得到最大回报?4 50 2 10 1 20 2 30 1表示共有四个商品,第一个价值为50保质期为两天,第二个价值为10保质期为一天。。。思路:贪心 + 并查集。我们肯定优先要卖贵的,所以我们需要按价值排个序。然后尽量在靠后的时间卖,因为这样可以给其他物品更多的时间进行选择。用并查集起一个标记查找原创 2018-01-18 20:04:28 · 299 阅读 · 0 评论 -
HDU ~ 3038 ~ How Many Answers Are Wrong (带权并查集)
题意:有N个数字,M组关系。每组关系三个数字a,b,s表示a~b的和为s。问与前面产生矛盾的话有几组?思路:带权并查集。多开一个权值数组,存储到自己和父节点的区间和。图一:路径压缩,b~root的和 = b~a的和 + a ~ root的和。图二:合并操作,现在我们知道a~root1和b~root2的区间和,又告诉了我们a~b的区间和,把root2并到root1上的话,root1~root2的区间原创 2018-01-18 17:14:24 · 348 阅读 · 0 评论 -
POJ ~ 1182 ~ 食物链 (带权并查集)
参考博客:POJ-1182 食物链思路:经典的带权并查集。除了并查集那个数组外,多开一个权值数组,或者把两个合成一个结构体数组。权值为每个点与根节点的关系//0:同类 1:吃 2:被吃。图一:路径压缩 图二:合并操作图三:a和b相对关系//#include#include#includeusing namespace std;const int MAXN = 50005;int n, m原创 2018-01-18 15:09:49 · 325 阅读 · 0 评论 -
HDU ~ 4496 ~ D-City (逆序并查集)
题意:Luxer是一个很坏的家伙,他会破坏他所遇到的一切。一天,Luxer去城。城有N个城市和M条路。每个条路连接两个城市。Luxer将摧毁所有的所有的路。城的市长想知道在Luxer破坏第k条路后,城市变成了多少连接块?当且仅当它们直接或间接连接时,两个点在同一个连接块中。输入的第一行包含两个整数N和M。接下来的M行每行包含2个整数u和v,这表示u和v之间有一条路。输出m行,第i行是在原创 2018-01-17 17:26:22 · 294 阅读 · 0 评论 -
POJ ~ 1611 ~ The Suspects (并查集)
题意:非典开始扩散,有许多学生团体。同一组的学生经常彼此相通,一个学生可以同时加入几个小组。为了防止非典的传播,一旦一组中有一个可能的患者, 组内的所有成员就都是可能的患者,我们需要把可能的患者都隔离。多组输入输出第一行为两个整数n和m, 其中n是学生的数量, m是团体的数量。0 每个学生编号是一个0到n-1之间的整数,一开始只有0号学生是患者。下面M行,每一行有一个整数k,代原创 2018-01-17 16:45:53 · 275 阅读 · 0 评论 -
ZOJ ~ 3261 ~ Connections in Galaxy War (逆序并查集 + map)
题意:星球大战,每个星球会有一个武力值,星球间有一些通道相连,直接或间接相连的星球可以互相求助(当然求助最厉害的星球啦)。先输入N表示有N个星球,编号为0~(n-1),然后输入M表示有M组关系,表示两个星球之间有通道。然后有Q次操作,操作有两种,1.query a:问a能求助的最厉害的星球是哪个2.destroy a b:a和b通道被摧毁了对于每个query操作输出一个能求助到的最厉害原创 2018-01-16 21:49:35 · 546 阅读 · 0 评论 -
HDU ~ 1272 ~ 小希的迷宫 (并查集 + set)
思路:用set保存有哪些编号。用并查集判断①是否有环 ②是否只有一棵树输入a,b就把a,b合并,如果a,b已经在一个集合中还要合并a,b那么就形成了环就是No,最后扫一边这些编号看形成了几棵树(即有几个根节点),超过一个就NO。数据有个很坑的点是输入0 0,应该输出Yes。程序最后多附了两组数据,有需要的可以看一下。//#include#include#include#inc原创 2018-01-16 10:06:22 · 396 阅读 · 0 评论 -
POJ ~ 1308 ~ Is It A Tree? (并查集 + set)
思路:和小希的迷宫题目一样,只是输出不同。吐槽POJ,不能用万能头,不能用序列for循环很烦。传送门:小希的迷宫//#include#include#include#includeusing namespace std;const int MAXN = 100005;int f[MAXN];set s;//所有的编号bool flag;//Yes/Novoid init(原创 2018-01-16 10:29:11 · 274 阅读 · 0 评论 -
POJ ~ 2236 ~ Wireless Network (并查集)
题意:地震了,电脑都坏了不工作了,现在要修复这些电脑,和询问这些电脑是否可以通信(如果距离不大于D就可以通信,超过D则不行)先输入N,D;N表示有多少台电脑,D表示距离;然后N行输入这些电脑所在的X,Y坐标;下面有一些询问或者修复操作以EOF结尾(在这里错了好几次);《1》如果第一个字母为‘S’则后边跟两个数字p,q表示询问p和q之间能不能通信,能通信输出SUCCESS,不能输出FAIL;原创 2018-01-16 09:15:03 · 300 阅读 · 0 评论 -
HDU ~ 1213 ~ How Many Tables (并查集模板题)
题意:有一群小朋友要吃饭,认识或者间接认识的人才可以做到一张桌子(每张桌子可以座无限多的人)上,输入n个人和m组关系,问最少需要多少张桌子?思路:并查集模板。#includeusing namespace std;const int MAXN = 1005;int n, m, f[MAXN];void init(){ for (int i = 0; i <= n; i++原创 2018-01-16 08:21:51 · 362 阅读 · 0 评论 -
UVALive ~ 3027 ~ Corporative Network (带权并查集)
题意:有n个结点,初始时每个结点的父节点都不存在。你的任务是执行一次I操作和E操作,格式如下。□I u v:把结点u的父节点设为v,距离为|u-v|%1000的余数。输入保证执行指令前u没有父节点。□E u:询问u到根节点的距离【输入个数】输入第一行为测试数据组数T。每组数据第一行为n(5≤n≤20000)。接线来有不超过20000行,每行一条指令,以‘O’结尾。I指令的个数小于n。【输出格式】对...原创 2018-05-03 21:58:12 · 222 阅读 · 0 评论