算法总结
focus_best
这个作者很懒,什么都没留下…
展开
-
后缀数组
后缀数组 后缀数组就是把一个文本串的所有后缀按字典序从小到大排放的数组。详细介绍见刘汝佳《算法竞赛训练指南》。 AC自动机可以处理多模板的文本匹配问题,而后缀数组也可以处理多模板的文本匹配问题。那么它们有什么区别呢? AC自动机需要事先知道所有的模板,然后对于一个(在线输入的)文本串进行多模板匹配,也就是说模板一定要全部事先知道,需要匹配原创 2015-03-31 00:46:04 · 3040 阅读 · 0 评论 -
最小生成树
最小生成树 一个有 n 个结点的连通图的最小生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的权值总和最小的边。刘汝佳>P343详细介绍了最小生成树相关的知识。 下面直接给出Kruskal算法的模板:#include#include#include#include#includeusing namespace std原创 2015-04-05 01:20:54 · 2244 阅读 · 2 评论 -
Bellman_Ford算法
Bellman_Ford算法 Bellman_Ford算法也是求单源最短路径的算法,但是它能算带负权边的图的最短路径(对于带负圈的图就无能为力),且可以判断当前图是否带有负圈。它的时间复杂度是O(n*m),其中n为点数,m为边数。 Bellman_Ford算法为什么能求得单源最短路径呢?因为它一共松弛n-1轮,每轮遍历了所有的边,所以它每轮至少要生成一个点的原创 2015-04-04 22:30:20 · 1746 阅读 · 0 评论 -
网络流
网络流 网络流问题的详细介绍可以看刘汝佳>和>相关部分。注意:下面的网络流模板里面考虑的都是有向图,如果要处理无向图,那么对于无向图的每条边,你需要再图上添加两个方向的边各一条且流量费用相同。 熟练模板并不是问题,问题是如何把实际的问题转化为网络流的问题来解决。直接给出最大流的模板://最大流模板,可处理重边//且节点编号从1到n,边编号从0到m原创 2015-04-13 21:29:12 · 2908 阅读 · 0 评论 -
BFS学习总结
BFS学习总结 给你一个n*m的网格迷宫,迷宫中有些格子不能走,其他的格子都能走。然后给你起点与终点,问你从起点走到终点最少需要多少步? 上面的问题就是一个典型的BFS问题,对于这类问题来说,只要你掌握了这类问题的关键思想,其实他们都是可以用类似的思路来做的。建议先做两道BFS简单题,体会一下。 你可以把BFS问题想象成:从一个父亲(起点原创 2015-04-15 23:53:09 · 4273 阅读 · 2 评论 -
Floyd算法
Floyd算法 Floyd算法又称为插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。 注意:由下面的练习可以看出,其实很多题目不是直接问你floyd怎么求最短路径,而是要你利用floyd的动态规划思想解决类似floyd的问题。 Floy原创 2015-04-04 19:14:04 · 2565 阅读 · 0 评论 -
AC自动机
AC自动机 直接学AC自动机比较难理解,强烈建议先学完KMP和字典树并进行一定的练习后,对于失配指针和字典树构造有一定理解后再来学AC自动机的内容。有关AC自动机的详细介绍可见刘汝佳的《算法竞赛入门经典训练指南》P214.给你一个字典(包含n个不重复的单词),然后给你一串连续的字符串文本(长为len),问你该文本里面的哪些位置正好出现了字典中的某一个或某几个单词?输出这些位原创 2015-03-29 22:09:50 · 3201 阅读 · 0 评论 -
树状数组
树状数组关于树状数组的详细介绍可见刘汝佳《算法竞赛入门经典:训练指南》 对于一个n元素的数组A[n],可执行如下操作: Add(I, d):让A[i]变成A[i]+d。 Query(L, R):返回A[L]+A[L+1]+…+A[R]。 注意:树状数组只能计算A[1]开始的和,A[0]这个元素是不能用的。上面操作复杂度都是原创 2015-03-14 21:35:27 · 2426 阅读 · 0 评论 -
线段树
线段树注意:线段树维护的元素 与线段树的节点不一样。线段树整体维护的是从1到n下标的元素(当然也可以维护0到n-1号元素或者其他任意一个区间的元素)但是拥有1到大约3*n的树节点,每个树节点维护一段[L,R]的区间内所有的元素信息(没有0号树节点,因为如果你要指定0号树节点为根的话,那么i号树节点的左右儿子就不是i*2节点和i*2+1节点了)。而树节点中每个节点i都有它需要维护的区间[原创 2015-03-20 11:04:33 · 3968 阅读 · 0 评论 -
字典树Trie
字典树Trie 字典树又叫单词查找树(Trie)或前缀树(可见刘汝佳《算法竞赛入门经典训练指南》P208)。顾名思义它是与单词的前缀相关的。给你一个单词和一个字典构成的字典树,你可以在O(m)(m为所给单词的长度)时间内判断出该单词是否属于字典。但是如果你用KMP或其他暴力方法,你至少需要把字典中所有单词都遍历一遍。下图是一个具有单词abc,abcd,b,bcd,efg,hi原创 2015-03-27 11:01:35 · 2493 阅读 · 2 评论 -
Dijkstra单源最短路径
Dijkstra单源最短路径 给定一个带权有向图G=(V,E) ,其中每条边的权是一个非负实数。另外,还给定 V 中的一个顶点,称为源。现在我们要计算从源到所有其他各顶点的最短路径长度。这里的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。 下面给出两个计算单源最短路径的模板。Dijkstra_简化版:时间复杂度O(n^2),不可处理重边图原创 2015-04-04 14:14:25 · 2241 阅读 · 1 评论 -
2-SAT问题
2-SAT问题 现有一个由N个布尔值组成的序列A,给出一些限制关系,比如A[x]AND A[y]=0、A[x] OR A[y] OR A[z]=1等,要确定A[0..N-1]的值,使得其满足所有限制关系。这个称为SAT问题,特别的,若每种限制关系中最多只对两个元素进行限制,则称为2-SAT问题。 由于在2-SAT问题中,最多只对两个元素进行限制,所以可能的限制关原创 2015-04-03 19:17:37 · 1524 阅读 · 1 评论 -
KMP算法
KMP算法 KMP算法求出ex[i]数组,ex[i]数组表示主串S中以第i个字符(也即S[i-1]位置)为尾字符的后缀与模式串T的前缀的最长公共部分。 KMP模板中,字符都是从下标0开始存放的,直到m-1位置。假设有两个串S和T,其中T为模板串,S为主串。KMP其实本质是用来看S中每个i位置的后缀最多能与T的多长的前缀匹配的算法。即前缀匹配后缀的算法。进行模式串原创 2015-03-26 10:33:36 · 2268 阅读 · 9 评论 -
RMQ(Range MinimumQuery)问题
RMQ(Range MinimumQuery)问题 有关RMQ的详细介绍可见刘汝佳《算法竞赛入门经典训练指南》P197页 RMQ问题可以解决对于一个整数数组(当然也可以是其他可比较大小的元素类型)的任意区间[L, R]查询最值时,以O(1)时间复杂度回答询问。其实它就是一种数据压缩的思想。 RMQ能在经过O(nlogn)的时间预处理后,做原创 2015-03-15 15:43:24 · 1386 阅读 · 0 评论 -
二分图判定
二分图判定 二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。 二分图的另一种等价的说法是,可以把每个节点着以黑色和白色之一,使得每条边的两个端点颜色不同.不难发现,原创 2014-06-14 17:31:47 · 1927 阅读 · 0 评论 -
拓扑排序
拓扑排序 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。 一个有向图无法拓扑排序时只有一种情况:该有向图中存在环。下面给出简单的判定有向图是否可拓扑排序的代码:题意:给你一个N点和M条有向边的图,问原创 2015-04-01 16:52:21 · 1673 阅读 · 1 评论 -
无向图求割顶与桥
无向图求割顶与桥 对于无向图G,如果删除某个点u后,连通分量数目增加,称u为图的关节点或割顶。对于连通图,割顶就是删除之后使图不再连通的点。如果删除边(u,v)一条边,就可以让连通图变成不连通的,那么边(u,v)是桥。 具体的概念和定义比较多,在刘汝佳训练指南>>P312-314页都有详细的介绍。 下面来写求无向图割顶和桥的DFS函数.我们令p原创 2015-04-02 14:14:22 · 2304 阅读 · 3 评论 -
无向图的双连通分量
无向图的双连通分量 点-双连通图:一个连通的无向图内部没有割点,那么该图是点-双连通图。 注意:孤立点,以及两点一边这两种图都是点-双连通的。因为它们都是内部无割点。 边-双连通图:一个连通的无向图内部没有桥,那么该图就是边-双连通的。 注意:孤立点是边-双连通的,但是两点一边不是边-双连通的。 由上面定义可原创 2015-04-02 18:45:47 · 3974 阅读 · 0 评论 -
Treap
Treap Treap是一种动态平衡的BST(Binary Search Tree),它每个节点拥有键值和优先级两种属性。对于键值而言,它是一颗排序二叉树。对于优先级而言,这棵树是堆(优先级最高的是根节点)。可以证明Treap中插入,删除和查找的期望时间复杂度均为O(logn)。关于Treap的更多介绍,可见刘汝佳《训练指南》P230。一般我们用Treap就是用来替代平衡二叉原创 2015-03-31 14:37:40 · 2795 阅读 · 0 评论 -
欧拉图详解
欧拉图详解 通过图(无向图或有向图)中所有边一次且仅一次行遍图中所有顶点的通路称为欧拉通路,通过图中所有边一次且仅一次行遍所有顶点的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph),具有欧拉通路而无欧拉回路的图称为半欧拉图。 1定义 欧拉通路(Euler tour)——通过图中每条边一次且仅一次,并且过每一顶点的通路。原创 2015-04-01 13:18:37 · 11448 阅读 · 0 评论 -
有向图的强连通分量
有向图的强连通分量 有向图强连通分量在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。原创 2015-04-03 11:10:25 · 2573 阅读 · 0 评论 -
并查集
并查集 并查集是一种数据结构,一般它处理的是图(其实是解决无向图的)的连通分量问题,但是当并查集的根节点可以维护更多的信息时,并查集可以解决范围更广的基于无向图连通分量的问题。做了这么多并查集的题目后,我感觉并查集就是解决有关物与物之间的关系问题的数据结构且这种关系还必须是可传递的关系,所以一般遇到这种问题可以先尝试用并查集解决。 并查集的基原创 2015-03-08 11:00:28 · 2661 阅读 · 6 评论