摘要:
点分治 1. 1 算法概述 点分治,是一种针对可带权树上简单路径统计问题的算法。本质上是一种带优化的暴力,带上一点容斥的感觉。 注意对于树上路径,并不要求这棵树有根,即我们只需要对无根树进行统计。接下来请把无根树这一关键点牢记于心。 1.2 问题引入 给定一棵树,树上的边有权值,给定一个阈值k,请统 阅读全文
摘要:
第k短路 1.1 问题引入 n个点,m条边的有向图,给出起点s,终点t,求s到t的第k,短路。 1.2 问题分析 一条路径可以由两部分组成,第一部分是一个从起点s出发到达任意点x的路径,而第二部分是从x出发,到终点t的最短路径。两部分正好可以组成一条s~t的路径,且每一条路径都可以分解这两部分(允许 阅读全文
摘要:
排序算法 1. 冒泡排序 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 1.1 算法描述 阅读全文
摘要:
启发式搜索 1. 相关概念 在宽度优先和深度优先搜索里面,我们都是根据搜索的顺序依次进行搜索,可以称为盲目搜索,搜索效率非常低。 而启发式搜索则大大提高了搜索效率,由这两张图可以看出它们的差别: 什么是启发式搜索( ) 用当前与问题有关的信息作为启发式信息,这些信息是能够提升查找效率以及减少查找次数 阅读全文
摘要:
树链剖分 1. 相关概念 重儿子:父亲节点的所有儿子中子树结点数目最多(size最大)的结点; 轻儿子:父亲节点中除了重儿子以外的儿子; 重边:父亲结点和重儿子连成的边; 轻边:父亲节点和轻儿子连成的边; 重链:由多条重边连接而成的路径; 轻链:由多条轻边连接而成的路径 如下图所示 2. 树链剖分的 阅读全文
摘要:
二分图的判定 如果一个图是连通的,可以用如下的染色法判定是否二分图: 我们把 部的结点颜色设为 ,`Y 1`。 从某个未染色的结点 开始,做 或者 。把 染为 ,枚举 的儿子 。如果 未染色,就染为与 相反的颜色,如果已染色,则判断 与`v`的颜色是否相同,相同则不是二分图。 如果一个图不连通,则在 阅读全文
摘要:
二分图 1. 概念 二分图 :把一个图的顶点划分为两个不相交集 和 ,使得每一条边都分别连接 、`V 1` 是一个二分图。为了清晰,我们以后都把它画成图 的形式。 匹配 :在图论中,一个「匹配」( )是一个 边 的 集合 ,其中 任意 两条 边 都 没有公共顶点 。例如,图 、图 中红色的边就是图 阅读全文
摘要:
最近公共祖先( ) 1. 概念 对于有根树 的两个结点 ,最近公共祖先 表示一个结点 ,满足 是`u,v`的 深度最大 的 祖先 节点。 算法分为 离线算法 和 在线算法 离线算法 ( ),是指基于在执行算法前输入数据已知的基本假设,也就是说,对于一个离线算法,在开始时就需要知道问题的所有输入数据, 阅读全文
摘要:
Tarjan算法求双连通分量 双连通 边双连通:连通的无向图中,对于两个点 u和v ,如果无论删去哪条边(只能删去一条)都不能使它们不连通,我们就说 u和v 边双连通 。 点双连通:连通的无向图中,对于两个点 u和v ,如果无论删去哪个点(只能删去一个,且不能删u和v 自己)都不能使它们不连通,我们 阅读全文
摘要:
Tarjan 1. DFS树(深度优先搜索树) 上图右图是左图以1为起点进行DFS时产生的生成树。 有向图的 DFS 生成树主要有 4 种边(不一定全部出现): 树边(tree edge):绿色边,每次搜索找到一个还没有访问过的结点(白点)的时候就形成了一条树边。 返祖边(back edge):黄色 阅读全文