随笔分类 - 图论
摘要:平面图 就是放在平面上展开,存在一种画法能够使得图的边与边之间没有交点,这玩意就叫平面图。 一般来说网格图喜欢考这个,提到网格图可以留个心眼。 但是一般来说吧,这个东西要配和着对偶图来使用。 对偶图 就是对于原平面图的每一条边,将与其接壤的两个面在对偶图中连一条边。特殊地,当且仅当对于一条边两边的面
阅读全文
摘要:冬令营突然发现的一个比较厉害的东西。 Dancing Links 用于解决覆盖性问题的利器。 两个不同分支,一个精准覆盖问题,一个可重复覆盖问题。 先讲相对基础的精准覆盖问题。 精确覆盖问题 就是说全集由多个集合恰好覆盖,各个集合间无交。 这个问题我们先考虑一个具体一些的问题。 我们用下面的那个 模
阅读全文
摘要:本质上大概是搜索优化。我们将bfs使用的队列改为优先队列,并使用结构体存储节点,重载 '<' 小于号。 然后我们提高搜索效率的方法就是通过一个估价函数,评估当前情况与答案情况的差异,然后选取差异最小(或根据题目,并基于个人经验选取能够更快找到答案的情况) 由于优先队列存在复杂度,有时候估价函数写得不
阅读全文
摘要:注: 求解K短路效率极其低下,时间复杂度,空间视题目而定,因为本质是爆搜,可求解数据范围较小的题目。 我们使用求解k短路: 首先需要预处理出估价函数。对于原图建立反向图,然后跑终点的单源最短路。用终点到这个点的距离作为的估价函数,可以完全保证搜索
阅读全文
摘要:考模拟赛考到了线段树合并,于是学了树上启发式合并(?) 它相较于线段树合并的优点在于: 空间开销小 无线段树的常数 写法简单易理解 好那么开始进入正题。 首先说一下它的用途,可以用来解决一些子树问题。 具体的做法是先 dfs 预处理,然后像树剖那样剖出重儿子,可以剖出 dfs 序为之后加上一点常数优
阅读全文
摘要:#include<bits/stdc++.h> using namespace std; #define re register #define MAXN 5010 struct side { int u,v,w; }s[200010]; int fa[MAXN],n,m,ans,cnt,cnt1;
阅读全文
摘要:在某些情况下可以和树剖替换。(当然某些情况替代不了,我愿称之为小树剖) 前置知识 倍增求LCA 了解差分思想 (既然要替代树剖怎么可能会用树剖求LCA呢/xyx) 引入 首先我们都知道差分是可以用来通过单点修改维护区间信息的(如单修区查的树状数组),因为我们在前面加上,再在后面减掉,中间这一段是得到
阅读全文
摘要:相当于把树上的链抽出来变成区间进行操作。 重链剖分(本文重点): 本文依照P3384 【模板】轻重链剖分/树链剖分的实现进行讲解。 就是剖分出重链覆盖全树。 重链:除开头的端点为轻儿子外,其他节点全为重儿子的链。 重儿子:一个节点的儿子中子树大小最大的儿子。 要进行树链剖分,先要进行预处理。需要处理
阅读全文
摘要:用于解决树上路径长问题的算法,复杂度是比较优秀的 直接按照题目来讲。点分治1 我们要维护树上路径长度为 的路径是否存在(当然视题目而定,点分治的操作比较灵活)。这类问题我们选用点分治。 具体怎么操作呢? 一般就是,每次用vis标记删除根节点,然后对于所有没被删除
阅读全文
摘要:可以说是带修改的点分治。(当然也可以不带修改,是那种需要多次询问的) 灵活性很强,我们可以维护一些树上点对问题。 话不多说了,直接进入正题。 具体操作 我们考虑对于保存点分治的路径,然后把这些点依次连接起来,点分树就建好啦。(很显然这个只是把树重构,然后保证树高为 ) 可以发现这
阅读全文
摘要:Tarjan系列!我愿称Tarjan为爆搜之王! 1.Tarjan求LCA 利用并查集在一遍DFS中可以完成所所有询问。是一种离线算法。 遍历到一个点时,我们先将并查集初始化,再遍历完一个子树之后,将该子树的根的父亲指向当前点。 最后在回溯的时候给询问的答案更新一下,枚举一下 $v\in [1,n]
阅读全文
摘要:实际上就是个链表。 #include<bits/stdc++.h> using namespace std; int n,m; vector<bool>vis; vector<int>head,next,to,val; /* head[i]存储以i为起点的第一条边的编号 next[i]存储编号为i的
阅读全文