并查集
qq_38232157
这个作者很懒,什么都没留下…
展开
-
洛谷 P2814 家谱(并查集,裸题)
并查集,裸题本题要点:1、 n <= 50000, 把名字离散化为整数,后面就是并查集的操作。压缩路径。#include <cstdio>#include <cstring>#include <iostream>#include <map>#include <string>using namespace std;const int MaxN = 5e4 + 10;int fa[MaxN];map<string, i原创 2020-09-20 14:28:17 · 78 阅读 · 0 评论 -
HOJ 6109 数据分割(并查集,启发式合并)
并查集,启发式合并本题要点:1、每两个数之间,有相等和不等关系。相等关系好处理, 并查集合并,判断根节点是否相等即可。两个数的不等关系,需要用到集合。打个比方, 有一个集合 {3, 4, 99, 150, 18} (表示这些数代表的物品相等),然后 有一条新的式子, 99 7 0(表示 99 和 7 不相等)。 这时候扩展开来,7 和 以上集合的数都不相等。2、用 set 来解决不相等的问题st[i] 这个set 集合,表示与i不相等的数的根节点集合。 //特别注意,这里存的是该数的根节点。不原创 2020-08-24 16:13:18 · 87 阅读 · 0 评论 -
CodeForces-123A Prime Permutation(并查集,贪心)
并查集,贪心题目意思:给出一个字符串 s, 长度 n <= 1000, 改变字符串的各个字母的顺序,使得:下标是素数的位置(假设为p), s[p] = s[p * i], 1 <= i <= n / p本题要点:1、并查集:把素数位p,满足条件 s[p] = s[p * i], 1 <= i <= n / p 的所有下标全部放到一个集合里面。用一个结构体 来记录,然后按 size 从大到小排序.struct node2 // p[i] 表示以i为父节点信息{原创 2020-08-20 12:51:14 · 99 阅读 · 0 评论 -
HOJ 1272 小希的迷宫(并查集,细节)
并查集,细节本题要点:1、并查集裸题:每次输出两个数 x 和 y, 当x 和 y 不属于同一个集合,那么直接合并。当x 和 y 属于同一个集合,说明从 x 到y有两条不同的路径。 输出 No2、题目注意的地方:当输入的图是不连通时,也是不符合要求的。可以用并查集判断图的连通。3、如果只输入0 0算作一组数据的话答案应该输出Yes#include <cstdio>#include <cstring>#include <iostream>using na原创 2020-08-19 21:01:23 · 114 阅读 · 0 评论 -
POJ 1962 Corporative Network(算法竞赛训练指南,带权并查集)
算法竞赛训练指南192页,带权并查集本题要点:1、命令处理:查询命令,E u, 先查询 u 的父节点, get(u), 然后 输出 u到根节点的距离 d[u].查询的时候,使用了路径压缩。同时累加 d[x] += d[fa[x]]2、I u v ,把 u的父节点设为v, 题目说明了当前的u点是没有父节点的。fa[x] = y, d[x] = abs(x - y) % 1000;#include <cstdio>#include <cstring>#include &原创 2020-08-12 14:04:44 · 106 阅读 · 0 评论 -
UVA 1160 X-Plosives(算法竞赛训练指南,并查集)
并查集, 算法竞赛训练指南, 191页题目意思:所以的元素看做是顶点,每两点连线,如果图中存在环的话,就会爆炸本题要点:1、每次读入 a, b, 如果 a 和 b 在同一个集合,就舍弃这两点。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MaxN = 100010;int a[MaxN], b[MaxN], fa[MaxN];in原创 2020-08-10 16:08:18 · 108 阅读 · 0 评论 -
HOJ 1856 More is better(并查集,离散化)
并查集,离散化题目意思:n对朋友(n <= 100000),每个人都有一个编号(编号最大值10000000)。问:要求最后挑选出的人之间都是朋友关系,可以说直接的,也可以是间接地。问最多可以挑选出几个人(最少挑一个)。 在基础的并查集上加个数组记录集合的数量。本题要点:1、人的编号 很大(编号最大值10000000),需要离散化。2、sum[i] 表示以i为根的集合,该集合有多少数。每一对朋友,合并。最后,扫描所有的 sum[i], 找出最大值即可。#include <c原创 2020-07-31 22:06:33 · 79 阅读 · 0 评论 -
HOJ 3635 Dragon Balls(并查集)
并查集题目意思:T a b 表示把a龙珠所在的城里的所有龙珠运到b所在的城里Q a 表示对a的询问,要求输出 a所在的城, a所在的城里一共有多少个龙珠, a经过几次到达现在所在的城的。(移动的次数)本题要点:1、主要是记录移动次数:其实每个根结点都是最多移动一次的,所以记录移动次数把自己的加上父亲结点的就是移动总数了#include <cstdio>#include <cstring>#include <iostream>using namespa原创 2020-07-31 17:05:17 · 77 阅读 · 0 评论 -
HOJ 1213 How Many Tables(并查集,裸题)
并查集,裸题题目意思:有n个人,有m组(每组两个人), 互相认识的人坐在一起。 问一个要有多少张桌子。本题要点:1、并查集:认识的两个人,合并 merge2、统计桌子数:扫描所有的 人, 如果 fa[i] == i, 说明需要一张桌子。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MaxN = 1010;int fa[MaxN原创 2020-07-31 15:11:09 · 109 阅读 · 0 评论 -
POJ 1611 The Suspects(并查集,记录集合总数)
并查集本题要点:1、sum[i] 表示以i点为父节点的集合总数, 初始化的时候,每个点以自身为父节点,sum[i] = 1;在合并操作的时候,fa[fay] =fax;sum[fax] += sum[fay];#include <cstdio>#include <algorithm>#include <cstring>#include <iostream>using namespace std;const int MaxN = 30010原创 2020-07-28 16:57:05 · 89 阅读 · 0 评论 -
洛谷 P1892 [BOI2003]团伙 (并查集)
并查集本题要点:1、fa数组开 2 * MaxN , 对于 1 <= i <= n, 用 i + n位置存放的是 i的敌人。2、敌人的敌人是朋友,那么如果 x 和y是敌人,则x 和 y + n 是朋友(因为 x 和 y + n 都是y的敌人), merge(y + n, x)y 和 x + n 是朋友(因为 y 和 x + n 都是x的敌人), merge(x + n, y)3、 如果仅仅是 x 和y 是朋友,则只需要 merge(x, y)#include <cstdio&原创 2020-06-21 23:15:00 · 153 阅读 · 0 评论 -
洛谷 P1525 关押罪犯(算法竞赛进阶指南, 并查集,贪心)
算法竞赛进阶指南,261页,并查集,贪心本题要点:1、贪心:先把所有的边从大到小排序,然后依次将边的两个点分到不同的两监狱中。(越大的怒气值的一组罪犯应分在两个不同的监狱里)如果选到某一条边,这条边的两个端点恰好在同一个集合中,说明这条边的长度就是答案。2、使用并查集:扫描每条边,两个端点(假设两个点为a, b点)位于不同的监狱中,这两个点互为敌人;如果a点有敌人(enemy[a] != 0),说明之前a点已经被分配到某个监狱了, 那么b点应该加入 enemy[a] 所在的集合;如果a点原创 2020-06-21 21:17:47 · 190 阅读 · 0 评论 -
洛谷 P1196 [NOI2002]银河英雄传说 (进阶指南,带边权的并查集)
算法竞赛进阶指南,196页,抄书上的代码。带边权的并查集。本题要点:1、 增加两个数组:int d[MaxN]; // d[x] 表示x与fa[x] 之间的权值之和;int size[MaxN]; // size[i] 表示以i点为父节点的集合 一共有多少个元素,也就是集合的大小;2、每一次 查询,执行路径压缩的时候,这条链路上的所有点的 d 值。具体看 get 函数;3、 每一次合并(将x为根的集合 加入到 以 y点为根的集合),a)更新 d[x] 的值,d[x] = size[y]b)更原创 2020-06-17 15:40:11 · 87 阅读 · 0 评论 -
洛谷 P1955 [NOI2015]程序自动分析 (进阶指南, 并查集,离散化)
算法竞赛进阶指南,194页,并查集本题要点:1、离散化,等式中的数字 10^9, 而一共 2 * 10^5 个不同的数字, 把所有数字装在数组a,然后排序,去重,放到数组b, 原来的一个数字映射到数组b的一个下标。 用 lower_bound 来查找每一个数字对应的下标。2、 并查集,相等关系具有传递性,扫描所有的式子,如果是等式(a == b),将 a 和 b 所在的并查集合并;然后扫描所有的不等式 (a != b),看看 a 和 b 是否属于同一个并查集即可。#include <cst原创 2020-06-17 12:06:25 · 134 阅读 · 0 评论