随笔分类 -  算法

字典数模板
摘要:[代码] 阅读全文
posted @ 2010-07-21 16:11 keep going 阅读(313) 评论(0) 推荐(0)
罗穗骞的dc3和倍增法
摘要:主要参考了 .罗穗骞《后缀数组——处理字符串的有力工具》和许智磊的后缀数组,现在能使用罗穗骞的dc3算法和倍增法倍增法模板o(nlgn)view plaincopy to clipboardprint?int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; int cmp(int *r,int a,int b,int l) {return r[a]... 阅读全文
posted @ 2010-06-01 18:27 keep going 阅读(1562) 评论(0) 推荐(0)
最近公共祖先(LCA)的Tarjan算法
摘要:最近公共祖先(LCA)问题LCA(T,u,v):在有根树T中,询问一个距离根最远的结点x,使得x同时为结点u、v的祖先LCA问题可以用朴素的DFS方法解决,但是时间复杂度就很高了,这里介绍一种高级一点的解决LCA问题的Tarjan算法。Tarjan算法是由Robert Tarjan在1979年发现的一种高效的离线算法,也就是说,它要首先读入所有的询问(求一次LCA叫做一次询问),然后并不一定按照原... 阅读全文
posted @ 2010-05-26 21:48 keep going 阅读(4008) 评论(1) 推荐(0)
tarjan LCA 算法
摘要:LCA是求最近公共祖先问题, tarjan的算法是离线算法,时间复杂度为O(n+Q),n为数据规模,Q为询问个数其中用到并查集。关键是dfs的主循环比较重要。离线算法就是对每个查询,都要求以下,此算法在lrj的黑书中简单提起过,后边还有O(n)-o(1)的算法,正在研究中。。。分类,使每个结点都落到某个类中,到时候只要执行集合查询,就可以知道结点的LCA了。 对于一个结点u,类别有 以u为根的子树... 阅读全文
posted @ 2010-05-26 21:37 keep going 阅读(784) 评论(0) 推荐(0)
多重背包问题
摘要:题目有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。基本算法这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件……取n[i]件。令f[i][v]表示前i种物品恰放入... 阅读全文
posted @ 2010-05-25 23:05 keep going 阅读(429) 评论(0) 推荐(0)
RMQ问题ST算法与模板
摘要:2007-07-15 15:48-------------------------------------算法简述-----------------------------------------ST算法O(nlogn)预处理,O(1)的查询指定区间的最值(以最小值为例)基本上是把待求区间[l,r]分为两段长为len的区间左边一段为[l,l+len-1],右边一段为[r-len+1,r]len必须... 阅读全文
posted @ 2010-05-24 23:16 keep going 阅读(1981) 评论(0) 推荐(1)
RMQ(Range Minimum/Maximum Query)问题:
摘要:RMQ问题是求给定区间中的最值问题。当然,最简单的算法是O(n)的,但是对于查询次数很多(设置多大100万次),O(n)的算法效率不够。可以用线段树将算法优化到O(logn)(在线段树中保存线段的最值)。不过,Sparse_Table算法才是最好的:它可以在O(nlogn)的预处理以后实现O(1)的查询效率。下面把Sparse Table算法分成预处理和查询两部分来说明(以求最小值为例)。预处理:... 阅读全文
posted @ 2010-05-24 23:14 keep going 阅读(385) 评论(0) 推荐(0)
看到的一个很不错的分析LCA和RMQ的文章(转载,先收着)
摘要:首先请看定义:一、最近公共祖先(Least Common Ancestors) 对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。另一种理解方式是把T理解为一个无向无环图,而LCA(T,u,v)即u到v的最短路上深度最小的点。 这里给出一个LCA的例子: 例一 对于T=<V,E> V={1,2,3,4,5} E={(1... 阅读全文
posted @ 2010-05-24 23:11 keep going 阅读(791) 评论(0) 推荐(0)
转一个后缀数组的简单总结:
摘要:后缀数组就是将字符串所有后缀排序后的数组,设字符串为S,令后缀Suffix(i)表示S[i..len(S)]。用两个数组记录所有后缀的排序结果:Rank[i]记录Suffix(i)排序后的序号,即Suffix[i]在所有后缀中是第Rank[i]小的后缀SA[i]记录第i位后缀的首字母位置,即Suffix[SA[i]]在所有后缀中是第i小的后缀然后就是怎么快速求所有后缀的顺序了,其中的关键是如何减少... 阅读全文
posted @ 2010-05-24 22:32 keep going 阅读(366) 评论(0) 推荐(0)
后缀数组总结
摘要:2009-10-25 09:05后缀数组是处理字符串的有力工具,后缀数组可以解决大多数后缀树解决的问题,由于它的实现要比后缀树简单,因此深受广大ACM爱好者的喜爱,当然还是有一些问题只有后缀树能解决的问题,等学习了后缀树再将其添上。后缀数组最常用的是求取最长公共前缀。后缀suffix数组,suffix【i】表示从第i个字符开始的后缀;后缀数组sa,保留1~n的某个排列,保证suffix【sa【i】... 阅读全文
posted @ 2010-05-24 22:31 keep going 阅读(530) 评论(0) 推荐(1)
字符串最小表示
摘要:求字符串的循环最小表示: 上面说的两个字符串同构的,并没有直接先求出Min(s),而是通过指针移动,当某次匹配串长时,那个位置就是Min(s)。而这里的问题就是:不是给定两个串,而是给出一个串,求它的Min(s),eg:Min(“babba”) = 4。那么由于这里并非要求两个串的同构,而是直接求它的最小表示,由于源串和目标串相同,所以处理起来既容易又需要有一些变化:我们仍... 阅读全文
posted @ 2010-05-23 23:30 keep going 阅读(2643) 评论(0) 推荐(4)
最小费用最大流问题
摘要:最小费用最大流问题 一、定义与定理最小费用最大流:设G是以s为源t为汇的网络,c是G的容量,b是G的单位流量费用,且有b[i][j] = -b[i][j],f是G的流,则b(f)=∑(fij*bij),(i, j)∈E(G) 且fij>0。最小费用最大流问题,就是求网络G的最大流f且使费用b(f)最小。这样的流称为最小费用最大流。二、算法思想用Ford-Fulkerson算... 阅读全文
posted @ 2010-05-21 19:36 keep going 阅读(577) 评论(0) 推荐(0)
SAP(最短增广路算法) 最大流模板
摘要:#include <iostream>#include <queue>#define msize 1024 //最大顶点数目using namespace std;int d[msize]; //标号int r[msize][msize]; //残留网络,初始为原图int num[msize]; //num[i]表示标号为i的顶点数有多少int pre[msize];int... 阅读全文
posted @ 2010-05-18 23:18 keep going 阅读(1685) 评论(1) 推荐(1)
最大流模板
摘要:#include <iostream> using namespace std; #define MAXN 205 #define INF 2110000000 #define MIN(x,y) (x<y?x:y) int map[MAXN][MAXN]; int max_flow(int num,int map[][MAXN],int source,int sink)//参数... 阅读全文
posted @ 2010-05-18 23:15 keep going 阅读(251) 评论(0) 推荐(1)
最大流算法小结
摘要:最大流算法小结 最近在看网络流,把几个常用的算法总结下,正确性的证明和一些理论的东西就不写了,参看算法导论和神牛们的论文,我只写算法的理解和实现模板。Ford-Fulkerson方法每次找增广路,把这条路上的所有点的流量加上这条路上的残余容量,再找新的增广路,直到找不到为止,它有很多种实现方法,下面给出算法导论上的伪代码Ford_Fulkerson(G,s,t){foreachedge(u,v)&... 阅读全文
posted @ 2010-05-17 22:12 keep going 阅读(620) 评论(0) 推荐(0)
KM算法
摘要:POJ 2195(KM算法) 转自大牛,牛人天天有,就是没有我啊这是一个典型的最大匹配的题目,题目意思是给出一些房子和一些人,每个人到每个房子都有一个相应的代价,最后要求怎么安排这些人,房子和人一一配对,使最后的代价最小。方法是KM算法,是一个求最大(最小)匹配的一个很强大的算法。不过这种题目还可以用费用流来做。下面是某牛的对KM算法讲解http://hi.baidu.com/anonympine... 阅读全文
posted @ 2010-05-17 20:27 keep going 阅读(524) 评论(0) 推荐(0)