各种模板
fa茶
这个作者很懒,什么都没留下…
展开
-
后缀数组suffix array
suffix array,LCP原创 2014-08-12 09:42:02 · 1011 阅读 · 0 评论 -
树链剖分模板(基于点权,基于边权)
树链剖分是数据结构在树上的推广,其实就是把树hash到几段连续的区间 dfs1()求出fa,deep,size,son dfs2()求出top,p关键数组: int deep[maxn]; int size[maxn]; int fa[maxn]; int p[maxn]; int son[maxn]; int fp[maxn]; int top[maxn];树链剖分 分为基于点权原创 2015-02-17 15:17:18 · 2020 阅读 · 0 评论 -
矩阵快速幂模板
int N;struct Mat { double mat[N][N];};Mat operator * (Mat a, Mat b) { Mat c; memset(c.mat, 0, sizeof(c.mat)); int i, j, k; for(k = 0; k < n; ++k) { for(i = 0; i < n; ++i)原创 2015-02-12 15:16:19 · 449 阅读 · 0 评论 -
匈牙利算法+KM算法
说明: 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配。我们依次枚举左边的点x的所有出边指向的点y,若y之前没有被匹配,那么(x,y)就是一对合法的匹配,我们将匹配数加一,否则我们试图给原来匹配y的x’重新找一个匹配,如果x’匹配成功,那么(x,y)就可以新增为一对合法的匹配。给x’寻找匹配的过程可以递归解决.从一边的未饱和点出发,寻找增广路复杂度:O(|E||V|−−−√原创 2015-03-18 14:12:01 · 2817 阅读 · 0 评论 -
二分匹配建模
转百度文库:http://wenku.baidu.com/link?url=lTpc5XJWQHf_1mzEbTZ1iA5apYInYofVPk9G7t9hsit913bhWziMc3Zvi8d6hL0G5j9mBSQykIAr1dn1-mThc5u8qEMCSSo8rQiUV0rLBVm1、行列匹配法,横纵坐标建图 例:http://poj.org/problem?id=3041行星2、黑白染色原创 2015-03-24 23:13:15 · 450 阅读 · 0 评论 -
哈希表
#define ll long long#define N 1000007const unsigned long long SMod=1000007;struct hashmap{ struct Edge { long long num; int next; }; Edge edge[2*N]; int countedge;原创 2015-03-09 20:08:25 · 430 阅读 · 0 评论 -
输入输出挂
int Scan() { int res = 0, ch, flag = 0; if((ch = getchar()) == ‘-‘) flag = 1; else if(ch >= ‘0’ && ch <= ‘9’) res = ch - ‘0’; while((ch = getchar()) >= ‘0’ && ch原创 2015-03-09 18:26:26 · 423 阅读 · 0 评论 -
LCA(least common ancestors)最近公共祖先
http://blog.csdn.net/hnust_xiehonghao/article/details/9109295对于有根树T的两个节点u、v,最近公共祖先LCA(u,v)表示一个节点x,满足x是u,v的祖先,且x的深度尽可能大 如果把树看成图,就是求到u,v的最短距离时间复杂度为O(n+q),n为树的节点数,q为询问次数 离线算法Trajan算法基于深度优先搜索,对于新搜索到的一个节点原创 2015-03-12 20:46:19 · 597 阅读 · 0 评论 -
数位DP模板
int dfs(int i, int s, bool e) { if (i==-1) return s==target_s; if (!e && ~f[i][s]) return f[i][s]; int res = 0; int u = e?num[i]:9; for (int d = first?1:0; d res转载 2014-07-23 10:16:08 · 591 阅读 · 0 评论 -
KMP模板
void getFail(char *p,int *f){ int m=strlen(p); f[0]=f[1]=0; int j=0; for(int i=1;i<m;++i){ while(j&&p[i]!=p[j]) j=f[j]; f[i+1]=p[i]==p[j] ? j+1 : 0; }}int KMP(c原创 2014-08-06 18:59:52 · 525 阅读 · 0 评论 -
最大流ISAP+Dinic
#include<iostream>#include<cstring>#include<cstdio>#include<vector>const int maxn=210;const int INF=0x3f3f3f3f;using namespace std;int n,s,t;struct Edge{ int from,to,cap,flow; Edge(int原创 2015-02-10 21:10:15 · 812 阅读 · 0 评论 -
基数排序 radixsort(LSD)
int maxbit(int data[],int n) //辅助函数,求数据的最大位数{ int d = 1; //保存最大的位数 int p =10; for(int i = 0;i < n; ++i) { while(data[i] >= p) { p *= 10; ++d;原创 2014-08-11 20:24:30 · 2015 阅读 · 0 评论 -
AC自动机
AC自动机1。指针p。指向当前已匹配的字符。若p指向root,则当前匹配的字符序列为空2。指针p->fail。指向与p有相同字符的节点,即p的失配指针。3。指针temp。1.构造Trie2.构造失败指针: 设该节点的字母为c,沿着它的父亲的失败指针走,直到某个节点的儿子的字母存在c,那么就将这个节原创 2014-08-10 10:48:47 · 616 阅读 · 0 评论 -
Trie模板
struct Trie{ int ch[maxnode][sigma_size]; int sz; int cont[maxnode]; Trie() {memset(ch,0,sizeof ch);memset(cont,0,sizeof cont);sz=1;} int idx(char c) {return c-'a';} void ins原创 2014-08-06 09:01:43 · 501 阅读 · 0 评论 -
凸包——Andrew(安德鲁)算法
凸包就是把给定点包围在内部的,面积最小的凸多边形。原创 2014-07-12 17:37:20 · 3069 阅读 · 0 评论 -
最小生成树——Kruskal算法 和 Prim算法
void Prim(int v){ int i,j,k,min; for(i=1;i<n;i++) { min=INF; for(j=0;j<n;j++) { if(lowcost[j]&&lowcost[j]<min) { min=lowcos原创 2014-07-09 22:18:52 · 695 阅读 · 0 评论 -
归并排序算法模板
归并排序:void merge_sort(int *A,int x,int y,int *T){ if(y-x>1) { m=x+(y-x)/2; int p=x,q=m,i=x; merge_sort(A,x,m,T); merge_sort(A,m,y,T); while(p<转载 2014-07-09 09:24:12 · 497 阅读 · 0 评论 -
并查集的启发式合并 和 路径压缩
并查集,就是Union-Find Set,也称不相交集合 (Disjoint Set)。并查集是建立在对不相交集合进行的两种基本操作的基础之上的。操作之一:检索某元素属于哪个集合;操作之二:合并两个集合启发式合并:让深度小的数成为深度较大的树的子树路径压缩:找到u所在的树根v以后,把从u到v的路径上所有点的父亲都设置为v原创 2014-07-08 22:07:07 · 2754 阅读 · 0 评论 -
最短路 Bellman-Ford(贝尔曼-福特)
#include#include#includeusing namespace std;#define inf 0x7ffffffstruct Edge{ int u,v,cost;}edge[2000];int pre[200];//父亲int dis[200];//到源点的距离int n,m,src;//点的个数,边数,源点bool relax(int原创 2014-07-13 20:35:24 · 1431 阅读 · 0 评论 -
最大流算法模板 Edmonds—Karp
Edmonds原创 2014-07-11 16:16:04 · 769 阅读 · 0 评论 -
区间DP结构
区间动态规划问题一般都是考虑,对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是分治思想的一种应用,将一个区间问题不断划分为更小的区间直至一个元素组成的区间,枚举他们的组合 ,求合并后的最优值。设F[i,j](1最小区间F[i,i]=0(一个数字无法合并,∴代价为0)每次用变量k(iFor p:=1 to n do // p是区间长度,作为阶段。 fo转载 2014-07-21 21:33:58 · 533 阅读 · 0 评论 -
动态规划 LCS,LIS
动态规划 LCS,LIS总结原创 2014-08-04 21:55:50 · 1046 阅读 · 0 评论 -
拓扑排序toposort 模板
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个 线性序列拓扑排序方法如下:(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.拓扑排序常用来确定一个依赖关系集中,事物发生的顺序in原创 2014-08-07 20:10:27 · 671 阅读 · 0 评论 -
输入输出挂
template<class T>inline void scan_d(T &ret)//适用于正整数{ char c;ret=0; while((c=getchar())<'0'||c>'9'); while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar();}template<class T>inline bool sc原创 2015-05-26 23:38:56 · 549 阅读 · 0 评论