并查集
Disjoint Union Set树状数据结构
努力的老周
一个老码农,中年大叔。打过工,做过老板。
现有神兽一枚,努力培养神兽中。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
并查集——(四)C++ 并查集模板
推荐使用的并查集模板。 #include <vector> template <class T> struct _DISJOINTSET { /* 当_ds[x]<0的时候,说明x的父节点是自己。同时 |_ds[x]| 表示集合内元素数量 当_ds[x]>0的时候,表示父节点 */ vector<T> _ds;//并查集 _DISJOINTSET(T n) { _ds = vector&原创 2020-11-03 13:46:07 · 353 阅读 · 0 评论 -
洛谷题解——P2814 家谱
题目相关 题目链接 洛谷,https://www.luogu.com.cn/problem/P2814。 MYOJ,http://47.110.135.197/problem.php?id=5344。 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先。 输入格式 输入由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系中父亲只有一行,儿子可能有若干行,用 #name 的形式描写一组父子关系中的父亲的名字,用 +name 的形式描写一组父子关系中的儿子的名字;接下来用原创 2020-09-29 18:40:02 · 635 阅读 · 0 评论 -
洛谷题解——P1621 集合
题目相关 题目链接 洛谷,https://www.luogu.com.cn/problem/P1621。 MYOJ,http://47.110.135.197/problem.php?id=5342。 题目描述 Caima 给你了所有 [a,b] 范围内的整数。一开始每个整数都属于各自的集合。每次你需要选择两个属于不同集合的整数,如果这两个整数拥有大于等于 p 的公共质因数,那么把它们所在的集合合并。 重复如上操作,直到没有可以合并的集合为止。 现在 Caima 想知道,最后有多少个集合。原创 2020-09-29 13:22:29 · 1252 阅读 · 0 评论 -
AtCoder题解——ACL Beginner Contest——C - Connect Cities
题目相关 题目链接 AtCoder ACL Beginner Contest C题,https://atcoder.jp/contests/abl/tasks/abl_c。 Problem Statement There are N cities numbered 1 through N, and M bidirectional roads numbered 1 through M. Road i connects City Ai and City Bi . Snuke can perform原创 2020-09-28 15:58:23 · 711 阅读 · 0 评论 -
并查集——(三)C++ 使用 STL 的 map 实现查并集功能
综述 我们接上一节,https://blog.csdn.net/justidle/article/details/108846236,继续讨论并查集问题。我们发现使用 C++ 数组实现并查集主要问题有以下几个: 1、元素中不能支持负数。因为 C++ 规定数组的下标不能是负数。 2、代码量相对比较大。实现并查集代码量相对有点大。 使用 map 实现并查集 我们可以使用 STL 的 map 这个数据结构来实现。map 本生就是两个数据的映射关系,天生就具有并查集的特点。而且 map 可以支持负数。原创 2020-09-28 14:20:19 · 4021 阅读 · 0 评论 -
并查集——(二)C++ 使用数组实现查并集功能
使用限制 使用数组表示查并集只能表示非负数。因为 C++ 规定数组的下标不能小于零。 数据定义 我们要根据题目的数据大小进行定义数组的大小。这里我们使用 0 ~ 1e5 的范围。 const int MAXN=1e5+4; int parent[MAXN]; 初始化 主要目的是将 parent 数组的值初始化为 -1,表示每个元素的父节点为自己。 void init() { memset(parent, -1, sizeof(parent); } 查询 查询元素 x 的父节点序原创 2020-09-28 11:49:29 · 1384 阅读 · 0 评论 -
并查集——(一)概述
并查集概念 在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。 并查集数据结构表示 常用的并查集实现有两种方法。 使用数组 我们使用数组来表示这样的数据结构。 比如,我们知道这个集合最大元素个数为 10^5 个,也就是 1 ~ 10^5。那么我们可以定义一个数组来记录每个元素的父节点。 const int MAXN=1e5+4; int parent[MAXN]; memset(parent, -1, sizeof(parent))原创 2020-09-28 11:11:51 · 470 阅读 · 0 评论
分享