导航

随笔分类 -  并查集

摘要:今天做 Codeforces 687D 突然发现并查集学得很屎。 问题是给你两个二部图的连通分量,用并查集表示,其中每个联通分量都有一个根。每个点有一个rela[i]代表这个点的颜色与根相同还是不同。 问如何将这两个集合合并,并维护rela。 想法很简单,判断添加边的两个点原先跟他们根的关系,若相同 阅读全文

posted @ 2016-07-13 18:22 tun~ 阅读(198) 评论(0) 推荐(0)

摘要:题意:有很多棒子,两端有颜色,告诉你两端的颜色,让你把这些棒子拼接起来要求相邻的接点的两个颜色是一样的。问能否拼接成功。思路:将颜色看作节点,将棒子看作边,寻找欧拉通路。保证图的连通性的时候用到并查集。这里颜色由于是字符串代替,所以需要用到字典树优化离散化过程。字典树的学习感谢博客http://ww... 阅读全文

posted @ 2015-10-07 19:26 tun~ 阅读(173) 评论(0) 推荐(0)

摘要:并查集的离线算法。题意是大坑。理解为寻找两点之间所有路径中的最长的边的值小于输入的值的点对的个数。直接来代码。#include#include#includeusing namespace std;struct ab{ int a,b,c;};int n;struct ab poi[50050... 阅读全文

posted @ 2015-05-20 21:41 tun~ 阅读(209) 评论(0) 推荐(0)

摘要:输入线段的两个短点,如果线段相交那么他们属于一个集合,查看第i条线段所在的集合有几条线段。好久没码码了,总是各种蠢。首先找出两条直线的方程,求解相交点的横坐标,然后看是不是在线段内部。没有注意题目中从1开始数,我自己写的从0开始数,各种wa。同时,又受到了杭电的输出大坑(between和fllowe... 阅读全文

posted @ 2015-05-20 21:36 tun~ 阅读(91) 评论(0) 推荐(0)

摘要:#include#includeint bot[30005];//以每个集合最底下的那个立方体作为根节点,初始化为自己本身int sum[30005];//表示以该元素为父亲节点的元素的编号的增量int cisum[30005];//根节点所在集合的立方体总数int num[30005];//记录每... 阅读全文

posted @ 2015-04-11 09:20 tun~ 阅读(89) 评论(0) 推荐(0)

摘要:种类并查集,基本思想是每次压缩路径都必须同时更新子节点和根节点的关系,这种关系是通过子节点和父亲节点的关系,以及父亲节点与根节点的关系运算出来。压缩路径的findme();参考了大神的代码,做的第二个种类并查集....#include#includeint cri[100005];//记录每一个元素... 阅读全文

posted @ 2015-04-11 09:05 tun~ 阅读(180) 评论(0) 推荐(0)

摘要:菜鸟第一次做这种。想了好一会儿.==首先还是初始化记忆数组,使得每一个元素的初始根节点是自己。然后是对输入的数据进行并集。我们拿出每组元素的第一个作为根节点。每次检测是否已经存在根节点。如果存在根节点压缩该元素通往新的根节点的路径,同时将其原来的根节点接在新的根节点上。第一次WA是因为忽略了剩余元素... 阅读全文

posted @ 2015-04-08 18:02 tun~ 阅读(150) 评论(0) 推荐(0)

摘要:并查集思想,初始化每个元素的根节点为本身。求解目标是求解存在几个集合。解决方案:查看有多少个根节点,表现在记忆数组上就是有多少个元素的根是它本身。#include#define M 50005int ji[M];int findme(int a){ while(ji[a]!=a) { ... 阅读全文

posted @ 2015-04-08 16:55 tun~ 阅读(117) 评论(0) 推荐(0)