随笔分类 - 图论
摘要:费用流问题指的是在网络流边权新增“代价”这一属性后,在得到最大流量的前提下最小化代价之和的问题。 我们依然使用基于增广路的算法,只不过每次使用Bellman_Ford来寻找最短路。 如果要求代价最小可以在代价变为正时停止增广。 代码:
阅读全文
摘要:涂色问题: 问题: 给出一个$n m$的矩阵($n,m\leq30$),每个格子都要求涂上一种颜色,且每个格子不能被涂两次以上(每次都是相同颜色则可以),涂同一行或列连续的一些格子涂色的代价分别为$a$,$b$,单独涂一个格子的代价为$c$,求将整个矩阵涂至目标状态的最小代价和。 解析: 我们先预处
阅读全文
摘要:SAP算法 网络流中性能与复杂度最适合的算法就是SAP算法了,且易于编写,由于该说的东西太多所以我就不说了各位自行翻书吧。 代码:
阅读全文
摘要:2 SAT 2 SAT指的是这样一类问题:给出$n$个布尔变量和$m$个限制,形如:$$x_i为真/假 或 x_j为真/假$$ 求满足所有条件的一组布尔值。 我们可以把它转化为一个图上的关系,设结点$2x_i$表示$x_i$为假,$2x_i+1$表示$x_i$为真 以关系$x_i 为真 或 x_j
阅读全文
摘要:虚树 有这样一类问题:给出一棵$n$个结点的树($n$为$10^5$级别),每次指定$m$个结点,给予它们一些性质,求出某个答案,保证$\sum m$与$n$同阶。 从保证总和这一点就可以看出,每次询问的复杂度必须基于$m$,这样才能保证总复杂度。但是这类问题往往需要通过树形DP来解决,这样复杂度就
阅读全文
摘要:强连通分量: 一个有向图内,若一个子图是强连通的,且满足极大性,则称它是原图的一个强连通分量。在将所有强连通分量缩为一个点后,即得到了一个DAG Kosaraju算法: 我们对原图进行一遍DFS,记录它结束的时间点,然后在反向图中从时间点从大到小DFS,每次DFS遍历的结点即在一个强连通分量中,时间
阅读全文
摘要:LCA: 在一棵有根树中,在两个节点的公共祖先中,深度最大的一个称为它们的最近公共祖先(LCA) 不难发现暴力求LCA时间复杂度是O(n)的,这里给出两种快速求LCA的方法: (1)倍增法: 类似于ST表,我们用parent[i][k]表示结点i的往上第2^k代祖先结点,在O(nlogn)时间内求出
阅读全文
摘要:匈牙利算法是对于二分图的无权最大匹配的算法,可以在O(n^3)时间内求出二分图的最大匹配数及匹配方案。 具体实现,即从X部一个结点开始DFS,寻找一条交错轨,然后交换各边的匹配状态,此时匹配数+1。当不存在增广路,匹配结束。
阅读全文
摘要:最小顶点覆盖: 在二分图中,选取尽可能少的一些结点,使任意一条边的两个端点至少有一个被选取。 König定理: 在二分图中, 最小顶点覆盖数=最大匹配数 ,其中选取的顶点都为匹配边的顶点。 König定理的证明: 这里给出一个简短的说法:在我们求出二分图的最大匹配数之后,对于一条未匹配边,它一定有一
阅读全文
摘要:网络流的经典算法,原理依旧遵循增广路定理,只是在Ford Fulkson算法的基础上,每次增广前求出残量网络中每个点到源点的距离,确保每次流的都是最短路。 注意当前弧优化
阅读全文
摘要:Bellman Ford算法是用于求出包含负权边的图的单源最短路,当存在负环返回错误信息,否则给出原点到各点的最短路,复杂度为O(nm) 其原理就是利用FIFO队列不断对可能边进行松弛操作,每当新松弛了一条边,将这条边加入队列。
阅读全文
摘要:迪杰斯拉特(Dijksta)算法用于在O(mlogn)时间内求出给定图的最短路,使用优先队列和邻接表来实现,通过当前最短路来对其他边进行松弛操作。 这里将边封装为一个数据结构(邻接矩阵确实方便,但内存也更大)。
阅读全文

浙公网安备 33010602011771号