ACM-模版-论文
文章平均质量分 52
暗金色
这个作者很懒,什么都没留下…
展开
-
最小费用最大流---MCMF模版
#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <vector>using namespace std;#define N 1010#define INF 0x3f3f3f3fstruct Edge{ int from, to, cap, flow ,cost;转载 2015-08-03 11:19:42 · 1673 阅读 · 0 评论 -
二维树状数组详解
以下摘自http://www.java3z.com/cwbwebhome/article/article1/1369.html?id=4804当要频繁的对数组元素进行修改,同时又要频繁的查询数组内任一区间元素之和的时候,可以考虑使用树状数组. 通常对一维数组最直接的算法可以在O(1)时间内完成一次修改,但是需要O(n)时间来进行一次查询.而树状数组的修改和查询均可在O(log(n))的时间内完成.转载 2015-11-07 19:59:07 · 783 阅读 · 0 评论 -
二维RMQ
二维RMQ和一维的RMQ差不多,只不过维护的时候多了两个维度 用dp[i][j][k][l]表示左上角为(i,j),右下角为(i + 2 ^ k - 1, j + 2 ^ l - 1)这个矩形内的最值初始化dp的时候,dp[i][j][0][0] = val[i][j] 接着用4层for去循环更新 for (int i = 1; i <= n; i++) for (int转载 2015-11-06 21:40:31 · 1787 阅读 · 0 评论 -
网络流---ISAP
引入求解最大流问题的一个比较容易想到的方法就是,每次在残量网络(residual network)中任意寻找一条从 s 到 t 的路径,然后增广,直到不存在这样的路径为止。这就是一般增广路算法(labeling algorithm)。可以证明这种不加改进的贪婪算法是正确的。假设最大流是 f ,那么它的运行时间为O( f⋅∣E∣) 。但是,这个运行时间并不好,因为它和最大流 f 有关。人们发现,如果每转载 2015-08-02 09:34:42 · 795 阅读 · 0 评论 -
KMP算法详解
以下转自http://blog.csdn.net/buaa_shang/article/details/9907183 字符串匹配是计算机的基本任务之一。 举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”?1. 首先,字符串”BBC ABCDAB ABCDABCDABDE”的第一个字符与搜索词”ABCDABD”的转载 2015-11-07 10:05:04 · 709 阅读 · 0 评论 -
树链剖分模版
摘自http://blog.sina.com.cn/s/blog_6974c8b20100zc61.html 稍有改动“在一棵树上进行路径的修改、求极值、求和”乍一看只要线段树就能轻松解决,实际上,仅凭线段树是不能搞定它的。我们需要用到一种貌似高级的复杂算法——树链剖分。树链,就是树上的路径。剖分,就是把路径分类为重链和轻链。记size[v]表示以v为根的子树的节点数,dep[v]表示v的深度(转载 2015-11-06 17:01:53 · 443 阅读 · 0 评论 -
01分数规划
【关键字】0/1分数规划、最优比率生成树、最优比率环【背景】根据楼教主的回忆录,他曾经在某一场比赛中秒掉了一道最优比率生成树问题,导致很多人跟风失败,最终悲剧。可见最优比率生成树是多么凶残的东西,但是这个东西只要好好研究半天就可以掌握,相信你在看了我写的这篇总结之后可以像楼教主一般秒掉这类问题。因为网上对于01分数规划问题的详细资料并不是太多,所以我就结合自己的一些理解总结这种问题的解法,因为水平有转载 2015-05-12 17:31:38 · 978 阅读 · 0 评论 -
manacher算法详解
以下摘自http://blog.csdn.net/ggggiqnypgjg/article/details/6645824/首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长。这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文有多长这个算法有一个很巧妙的地方,它把奇数的回文串和偶数的回文串统一起来考虑了。这一点一直是在做回文转载 2015-11-07 12:44:09 · 441 阅读 · 0 评论 -
最小表示法和最大表示法详解
以下摘自http://blog.csdn.net/zy691357966/article/details/39854359求字符串的循环最小表示:上面说的两个字符串同构的,并没有直接先求出Min(s),而是通过指针移动,当某次匹配串长时,那个位置就是Min(s)。而这里的问题就是:不是给定两个串,而是给出一个串,求它的Min(s),eg:Min(“babba”) = 4。那么由于这里并非要求两个串的转载 2015-11-07 13:18:15 · 1523 阅读 · 0 评论 -
Fluery算法
以下摘自http://www.cnblogs.com/Lyush/archive/2013/04/22/3036659.html上面是摘自图论书上的定义。算法在运行过程中删除了所有已走的路径,也就是说途中残留了所有没有行走的边。根据割边的定义,如果在搜索过程中遇到割边意味着当前的搜索路径需要改进,即提前输出某一个联通子集的访问序列,这样就能够保证访问完其中联通子图中后再通过割边访问后一个联通子图,最转载 2015-11-06 19:53:23 · 1559 阅读 · 1 评论 -
01分数规划
摘自http://blog.csdn.net/hhaile/article/details/8883652 因为当前只看了01分数规划,所以后面的就没拷贝过来了,想看的可以自己点链接 【关键字】 0/1分数规划、最优比率生成树、最优比率环 【背景】 根据楼教主的回忆录,他曾经在某一场比赛中秒掉了一道最优比率生成树问题,导致很多人跟风失败,最终悲剧。可见最优比率生成树是多么凶残的东西,但是转载 2015-11-08 18:18:09 · 542 阅读 · 0 评论 -
最长公共子序列
转自http://blog.csdn.net/v_july_v/article/details/6695482第一节、问题描述 什么是最长公共子序列呢?好比一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。举个例子,如:有两条随机序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,则它们的最长公共子序列便是:转载 2015-11-08 15:24:42 · 518 阅读 · 0 评论 -
最长上升子序列
转自:http://blog.csdn.net/dangwenliang/article/details/5728363 稍有改动这题目是经典的DP题目,也可叫作LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列。很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) 。A.O(n^2)算法分析如下: (a[1]…a[n]转载 2015-11-08 16:32:49 · 428 阅读 · 0 评论 -
HDU - 3507 Print Article(斜率DP)
题目大意:就是那个公式了解题思路: 以下参考了传送门 设dp[i]为前i个的和 则dp[i] = min(dp[j] + (sum[i] - sum[j]) ^ 2) 设j < k,则k点比j点更优,则 dp[j] + (sum[i] - sum[j]) ^ >= dp[k] + (sum[i] - sum[k]) ^ 2 化简得 dp[j] + sum[i] ^ 2 + sum[j]原创 2015-10-07 10:14:18 · 434 阅读 · 0 评论 -
最短路---Dijkstra模版
Dijkstra算法1.定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。问题描述:在无向图 G=(V,E) 中,假设每条边 E[转载 2015-08-04 19:04:15 · 708 阅读 · 0 评论 -
扩展KMP详解
以下摘自http://www.cnblogs.com/yefeng1627/archive/2012/12/24/2830979.html 刘雅琼PPT讲解链接:http://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html扩展KMP: 给出模板串A和子串B,长度分别为lenA和lenB,要求在线性时间内,对于每个A[i](0 <= i转载 2015-11-07 11:08:31 · 838 阅读 · 0 评论 -
BellmanFord判环算法
转自 http://blog.csdn.net/niushuai666/article/details/6791765Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝转载 2015-09-16 16:59:06 · 708 阅读 · 0 评论 -
Kruskal算法
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int MAXNODE = 1010;const int MAXEDGE = 1000010;typedef int Type;struct Edge{ int u, v; T转载 2015-09-10 20:09:05 · 404 阅读 · 0 评论 -
二分图染色模板
二分图染色一般是用来判断是否冲突的#include <cstdio>#include <cstring>const int MAXNODE = 510;const int MAXEDGE = 100010;struct Edge{ int v, next; Edge() {} Edge(int v, int next): v(v), next(next) {}}E[MA转载 2015-09-08 11:37:44 · 722 阅读 · 0 评论 -
二分图多重匹配
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N = 1010;vector<int> g[N];//vlink记录的是每个结点已经匹配了多少个点了//link记录的是第i个结点的第j个匹配点是什么//cap是每个结点的最大匹转载 2015-09-13 23:11:42 · 628 阅读 · 0 评论 -
二分图匹配Hungary算法
算法讲得挺形象的详细解说#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N = 1010;vector<int> g[N];//link表示第i个结点的匹配点int link[N];int n;bool vis[N];bool转载 2015-09-13 23:07:41 · 535 阅读 · 0 评论 -
LCA的暴力查询
找两个结点的最近公共祖先,其实要找的就是两条链的第一次相交点 我们假设要找寻u和v的最近公共祖先,把u和v到树根的路径找出来,可以发现,他们的最近公共祖先就是两条链的第一个交点 按照这个思路来想,我们可以先dfs一次,标记每个点的时间戳,然后依据时间戳往前回溯,直到两个结点回溯的时间戳相等。这个时间戳的点就是两个点的最近公共祖先了#include <cstdio>#include <cstri转载 2015-09-13 18:58:22 · 874 阅读 · 1 评论 -
朱刘算法
最小有向生成树:给定一个有向带权图G和其中一个点u,找出一个以u为跟结点,权和最小的有向生成树。有向生成树也叫树形图,是指一个类似树的有向图,满足以下条件: 1.恰好有一个入度为0的点,称为根结点 2.其他结点的入度均为1 3.可以从根结点到达其他结点算法的主过程如下: 1.找到除了root以为其他点的权值最小的入边。用In[i]记录 2.如果出现除转载 2015-09-11 17:43:31 · 4739 阅读 · 3 评论 -
Floyd算法详解
本篇摘自探求Floyd算法的动态规划本质Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法。从表面上粗看,Floyd算法是一个非常简单的三重循环,而且纯粹的Floyd算法的循环体内的语句也十分简洁。我认为,正是由于“Floyd算法是一种动态规划(Dynamic Programming)算法”的本质转载 2015-11-05 10:14:10 · 1818 阅读 · 0 评论 -
LCA的离线算法 tarjan
对于最近公共祖先问题,我们先来看这样一个性质,当两个节点(u,v)的最近公共祖先是x时,那么我们可以确定的说,当进行后序遍历的时候,必然先访问完x的所有子树,然后才会返回到x所在的节点。这个性质就是我们使用Tarjan算法解决最近公共祖先问题的核心思想。 同时我们会想这个怎么能够保证是最近的公共祖先呢?我们这样看,因为我们是逐渐向上回溯的,所以我们每次访问完某个节点x的一棵子树,我们就将该子树所有节转载 2015-09-12 17:10:00 · 460 阅读 · 0 评论 -
次小生成树模版(MST)
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int MAXNODE = 1010;const int MAXEDGE = 1000010;typedef int Type;struct Edge{ int u, v; T转载 2015-11-04 21:57:33 · 433 阅读 · 0 评论 -
无向图的连通分量(BCC)模版
点双连通:如果任意两点之间至少存在两条”点不重复”的路径,则说这个图是点双连通的,这个要求等价于任意两条边都在同一个简单环中,即内部无割点边双连通:如果任意两点至少存在两条“边不重复“的路径,我们说这个图是边-双连通的,这个要求低一点,只需要每条边都至少在一个简单环中,即所有的边都不是桥对于一张无向图,每条边恰好属于一个双连通分量,但不同的双连通分量之间可能会有公共点,但是不同的双连通分量之间的公共转载 2015-09-08 15:42:48 · 1790 阅读 · 0 评论 -
ST算法
求LCA(最近公共祖先)的算法有好多,按在线和离线分为在线算法和离线算法。 离线算法有基于搜索的Tarjan算法较优,而在线算法则是基于dp的ST算法较优。 首先说一下ST算法。 这个算法是基于RMQ(区间最大最小值编号)的 而求LCA就是把树通过深搜得到一个序列,然后转化为求区间的最小编号。 比如说给出这样一棵树。 我们通过深搜可以得到这样一个序列: 节点ver 1 3 1 2 5转载 2015-09-12 16:20:48 · 1609 阅读 · 0 评论 -
网络流---EK模版
EK算法就是不断的从源点到汇点找增光路进行增广有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点,通常规定为1号点。另一个点也很特殊,只进不出,叫做汇点,通常规定为n号点。每条有向边上有两个量,容量和流量,从i到j的容量通常用c[I,j]表示,流量则通常是f[I,j]。通常可以把这些边想象成道路,流量就是这条道路的车流量,容量就是道路可承受的最大的车流量。很显然的,流量<=容量。而对于每个不转载 2015-08-02 09:33:49 · 802 阅读 · 0 评论 -
网络流---Dinic
Dinic算法是在Edmonds-Karp算法上的改进它与最短路径增值算法不同之处是:在Dinic算法中,我们用一个dfs过程代替多次bfs来寻找阻塞流。下面给出其算法步骤:算法流程: 以上转自http://blog.csdn.net/pi9nc/article/details/23339111 第一种:书上的模版#include <cstdio>#include <cstring>#i转载 2015-08-02 09:35:32 · 712 阅读 · 0 评论 -
强连通分量(SCC)详解
说到以Tarjan命名的算法,我们经常提到的有3个,其中就包括本文所介绍的求强连通分量的Tarjan算法。而提出此算法的普林斯顿大学的Robert E Tarjan教授也是1986年的图灵奖获得者(具体原因请看本博“历届图灵奖得主”一文)。首先明确几个概念。 强连通图。在一个强连通图中,任意两个点都通过一定路径互相连通。比如图一是一个强连通图,而图二不是。因为没有一条路使得点4到达点1、2或3。强转载 2015-09-08 16:05:40 · 3445 阅读 · 0 评论