常用模板
文章平均质量分 68
H煊
缓一会儿。。。
展开
-
BFS(坐标)
const int INF=100000000;//使用pair表示状态:typedef pair P;//输入:char maze[maxn][maxn];//表示迷宫的数组;int N,M;int sx,sy;//起点坐标;int gx,gy;//终点坐标;int d[maxn][maxn];//到各个位置的最短距离的数组;//4个方向移动的向量;int dx[4]原创 2017-06-04 21:48:17 · 292 阅读 · 0 评论 -
无向图的连通分量
void dfs(int s){ mark[s]=true; for(int i=1;i<=n;i++) if(G[s][i]&&!mark[i])//有边(s,i),且顶点i未标记 dfs(i);} for(int i=1;i<=n;i++){ if(!mark[i]) { dfs(i); ans++; }}原创 2017-08-12 21:27:43 · 745 阅读 · 0 评论 -
ZOJ 1083 Frame Stacking(拓扑排序)
Frame StackingTime Limit: 2 Seconds Memory Limit: 65536 KBConsider the following 5 picture frames placed on an 9 x 8 array.Now place them on top of one another starting with 1 at原创 2017-08-20 10:34:12 · 626 阅读 · 0 评论 -
ZOJ 1117 Entropy(哈夫曼树)
EntropyTime Limit: 2 Seconds Memory Limit: 65536 KBBackgroundAn entropy encoder is a data encoding method that achieves lossless data compression by encoding a message with ��wasted原创 2017-08-19 22:13:00 · 977 阅读 · 0 评论 -
ZOJ 1141 Closest Common Ancestors(LCA)
Closest Common AncestorsTime Limit: 10 Seconds Memory Limit: 32768 KBWrite a program that takes as input a rooted tree and a list of pairs of vertices. For each pair (u,v) the program d原创 2017-08-20 16:28:40 · 271 阅读 · 0 评论 -
2-SAT
int main(){ // // V=6; // add_edge(3,4);// add_edge(1,0);// // add_edge(4,2);// add_edg原创 2017-08-14 23:10:23 · 284 阅读 · 0 评论 -
浅谈几大最短路
常用四大最短路算法:Dijkstra: 平凡实现O(V^2),使用数据结构堆优化O(ElogV),不适用于负权Bellman-Ford: O((V*E)适用负权SPFA: O(kE (k一般Floyd-Warshall: O(V^3)适用负权最短路的一般操作:(1)初始化: d数组全部赋值为INF(无穷大),d[s]=0;prev数组全部赋值为-1,表示还没有知原创 2017-08-05 11:55:08 · 226 阅读 · 0 评论 -
割点、割边
代码:int cnt=0;int index=0; void dfs(int u) { dfn[u] = low[u] = ++index; for(int v = 0; v < n; v++) { if(G[u][v]) { if(!dfn[v]) {原创 2017-08-25 17:59:59 · 250 阅读 · 0 评论 -
splay树
splay树(伸展树):概述:二叉查找树的一种改进数据结构,是可以随意翻转的二叉树平摊时间复杂度:O(logn)基本操作:类似AVL数操作,分为3种情况:(1)zig (2)zig-zag (3)zig-zig原创 2017-08-27 09:24:55 · 246 阅读 · 0 评论 -
KMP算法
BF算法:O(n*m)代码:int index(string S,string T)//返回主串S中与模式串T匹配的字符序列第一个字符的序号;{ int i=1,j=1; while(i<=S.length()&&j<=T.length()) { if(S[i]==T[j]) i++,j+原创 2017-06-07 21:12:22 · 225 阅读 · 0 评论 -
有向图的强连通分量分解
int V;//顶点数vector G[max_v];//图的邻接表表示vector rG[max_v];//图的逆邻接表表示vector vs;//后续遍历顺序的顶点列表bool used[max_v);//访问标记int cmp[max_v];//所属强连通分量的拓扑序void add_edge(int from,int to){ G[原创 2017-08-14 18:27:46 · 1136 阅读 · 0 评论 -
tarjan算法浅谈
1.求割点: 割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点。 原理:若low[v]>=dfn[u],则u为割点。因low[v]>=dfn[u],则说明v通过子孙无法到达u的祖先。那么对于原图,去掉u后,必然会分成两个子图。 所以处理节点u时,先递归v的子节点,然后回溯至u时,如果满足low[v]>=dfn[u],则u为割点。代码:int dfn[maxn], lo原创 2017-09-15 18:15:42 · 345 阅读 · 0 评论 -
后缀数组(倍增法)
后缀数组(Suffix Array):将某个字符串的所有后缀按字典序排序后得到的数组。算法:朴素实现:直接将所有后缀进行排序,将n个长度为O(n)的字符串进行排序,时间复杂度O(n^2*logn);倍增算法:通过充分利用各个后缀之间的联系,将构造后缀数组的最坏时间复杂度成功降至O(n*logn)。倍增法实现:首先计算从每个位置开始的长度为1的子串的顺序,再利用这个结果计算长度为2的子串的顺原创 2017-09-07 23:33:42 · 1508 阅读 · 0 评论 -
AC自动机
ac自动机是kmp的高级版,实现多模式串匹配。代码:struct AC{ int next[500005][26], fail[500005], word[500005], Q[500005]; int root, tol; int newNode(){ for(int i = 0; i < 26; i++) next[t原创 2017-09-15 21:07:13 · 479 阅读 · 0 评论 -
虚树
虚树原创 2017-09-11 20:52:24 · 214 阅读 · 0 评论 -
最大流之Dinic算法
之前简单介绍了最大流之Ford-Fulkerson算法,此算法时间复杂度为O(F*E)。大多数情况下,这个算法已经足够高效了,但当顶点数或最大流流量非常大时,这个算法就显得不够快了。下面简单介绍易实现的Dinic算法。Ford_Fulkerson算法通过深度优先搜索寻找增广路,并沿着它增广。与之相对,Dinic算法总是寻找最短的增广路,并沿着它增广。时间复杂度O(E*V^2),不过。该算法在实原创 2017-09-20 21:00:05 · 571 阅读 · 0 评论 -
欧拉路,回路
判定: 欧拉路: 有向图:图连通,有一点入度>出度,有一点出度>入度,其余点入度=出度或入度=出度;Play on Words 无向图:图连通,零个或两个奇数度,其余偶数度;一笔画问题 欧拉回路: 有向图:图连通,入度=出度; 无向图:图连通,零个奇数度;John's trip ...原创 2018-05-16 15:42:15 · 167 阅读 · 0 评论 -
邻接表的几种存储方式
总的来说有以下三种方式:链表://存储结构 struct Node{ int vex; Node* next;}; Node *head[M]; //添加一个有向边 void addADJ(int u,int v){ Node *p; p=(Node*)malloc(sizeof(Node)); p->vex=v; p->ne原创 2017-08-04 22:09:39 · 1160 阅读 · 0 评论 -
Aho-Corasick算法—Trie图(AC自动机)
功能:解决多模式串匹配问题;实现:建立Trie树点击打开链接,以此为基础添加失败路径(实质前缀指针),以母串作为DFA的输入,在DFA 上行走,走到终止节点,就意味着匹配了相应的模式串。ps:根据深度一一求出每一个节点的失败路径(前缀指针);第二层要特殊处理,将这层中的节点的失败路径(前缀指针)直接指向父节点(也就是根节点);代码:稍后更新。。。原创 2017-08-03 22:25:50 · 677 阅读 · 0 评论 -
最小生成树
首先明确最小生成树是无向图,接下来简单讲解Prim算法和Kruskal算法。Prim算法:首先我们假设有一棵只包含一个顶点v的树T,然后贪心地选取T和其他顶点之间相连的最小权值的边,并把它加到T中。不断进行这个操作,就可以得到一棵生成树了。特点:适合稠密图,其时间复杂度为O(v^2);采用邻接矩阵储存边权;不推荐使用此算法;Kruskal算法:首先按照边的权值的顺序从小到大查看一遍,如原创 2017-08-11 00:17:46 · 176 阅读 · 0 评论 -
埃氏筛法
时间复杂度:O(nlognlogn),对于程序设计竞赛中的数据规模,看作线性也无妨代码:int prime[maxn];//第i个素数bool is_prime[maxn+1];//is_prime[i]为true表示i是素数//返回n以内素数的个数int sieve(int n){ int p=0; for(int i=0;i<=n;i++)原创 2017-06-16 18:31:57 · 229 阅读 · 0 评论 -
滚动哈希(Rabin-Karp算法)
滚动哈希:O(n+m)时间内完成字符串匹配;实现:选取两个合适的互素常数b和h(l其中b是基数,相当于把字符串看作b进制数。这样,字符串S=s1s2s3...sn从位置k+1开始长度为m的字符串子串S[k+1...k+m]的哈希值,就可以利用从位置k开始的字符串子串S[k...k+m-1]的哈希值,直接进行如下计算:H(S[k+1...k+m])=(H(S[k...k+m-1])* b -原创 2017-06-03 23:00:42 · 9921 阅读 · 0 评论 -
树状数组(BIT)
功能:给一个初始值全为0的数列a[1],a[2],...a[n],能够在O(logn)时间内完成以下操作1)给定i,计算a[1]+a[2]+...+a[i]2)给定i和x,执行a[i]+=x代码://区间[1,n]int bit[max_n+1],n;int sum(int i){ int s=0; while(i>0)原创 2017-07-02 20:00:03 · 185 阅读 · 0 评论 -
矩阵快速幂模板
作用:计算特殊的递推式;难点:构建矩阵递推式;代码://用二维vector来表示矩阵typedef vector vec;typedef vector mat;typedef long long LL;const int MOD = 1000;//计算A*Bmat mul(mat &A,mat &B)//返回mat类型;{ mat C(A.siz原创 2017-05-25 21:28:39 · 230 阅读 · 0 评论 -
线段树
线段树:擅长处理区间的数据结构,对区间的操作(1.查询 2.更新)可以在O(logn)时间内完成;代码:(基于线段树的RMQ)const int INF=0x3f3f3f3f;const int maxn=1<<17;//存储线段树的全局数组;int n,dat[2*maxn-1];//初始化void init(int n_){ //为计算方便,元素个数原创 2017-06-07 23:13:52 · 188 阅读 · 0 评论 -
最大流之Ford-Fulkerson算法
核心:通过DFS寻找增广路,直至没有增广路,此时的F即为最大流;操作实质:正向流量流多少,正向容量减多少,反向容量增多少;下述代码为Ford-Fulkerson算法的邻接表实现,为了方便通过直接改变c(e)的值,而没有保存f(e)的值;代码://用于表示边的结构体(终点,容量,反向边)struct edge{ int to,cap,rev;};原创 2017-07-29 20:12:15 · 1538 阅读 · 0 评论 -
二分图最大匹配问题之网络流算法
实质:把多源,多汇网络,构造成单源单汇网络,同时置所有边的容量为1。操作:(G=(X∪Y,E))(1)增加一个源点s和一个汇点t;(2)从s向集合X的每一个顶点引一条有向边,从集合Y的每一个顶点向t引一条有向边;(3)将原图的每条边改为从集合X向集合Y的有向边;(4)置每条边的容量为1;代码中的函数参见最大流模板点击打开链接代码://输入int N,K;/原创 2017-07-30 19:24:20 · 4981 阅读 · 0 评论 -
Manacher算法
功能:O(n)时间内计算最长回文子串的长度;操作:先在每两个相邻字符中间插入一个分隔符,分隔符要在原串中没有出现过(一般用‘#’分隔);P[i]记录以字符str[i]为中心的最长回文串,即str[i-p[i],i-1] == str[i+1,i+p[i]],则P[i]-1就是该回文子串在原串中的长度;求出p[i],即可知道最大回文子串长度;思路:为什么能使时间复杂度为O(n*n)的原创 2017-07-10 07:56:53 · 166 阅读 · 0 评论 -
一般图最大匹配的匈牙利算法
代码:(邻接表实现)int V;//顶点数vector G[max_v];//图的邻接表表示int match[max_v];//所匹配的顶点bool used[max_v];//DFS中用到的访问标记//向图中增加一条连接u和v的边void add_edge(int u,int v){ G[u].push_back[v]; G[v].pu原创 2017-07-31 23:16:57 · 586 阅读 · 1 评论 -
最小路径覆盖
概述:在一个有向图G中,如果在图G中有一些路径,使之覆盖了图G中的所有顶点,且任何一个顶点有且只有一条路径与之关联,那么最小路径覆盖就是最少条数的路径。ps:一个单独的顶点也是一条路径。性质:无圈有向图G的最小路径覆盖数=V-与其对应的二分图G‘的最大匹配数ps:对于一个有向图G=(V,E),对应的二分图G‘=(V,E,V)的构建方式为:对G的有向边(u,v),在G‘中有对应的原创 2017-08-01 00:04:20 · 230 阅读 · 0 评论 -
A*算法
A*算法:一种典型的人工智能启发式搜索算法,被广泛应用在最优路径求解和一些策略设计的问题中。启发式搜索:与DFS和BFS这类盲目型搜索最大的不同,就在于当前搜索结点往下选择下一步结点时,可以通过一个启发函数来进行选择,选择代价最小(大)的结点作为下一步搜索结点,以求得问题的最小(大)值。选择代价最小(大):STL库中的数据结构priority_queue。估价函数:f(n)=g(n)+原创 2017-08-08 23:31:41 · 497 阅读 · 1 评论 -
二分图最大匹配问题之匈牙利算法
核心:寻找增广路径;操作实质:当前的匹配对象与上一步的匹配对象相同时,回溯上一步能否换另一个匹配对象,若不能换,则不换,反之换;即能妥协就妥协,不能妥协坚决不妥协;时间复杂度:O(V*E)代码:int V;//顶点数vector G[max_v];//图的邻接表表示int match[max_v];//所匹配的顶点bool used[max_v];//DFS中用到的访原创 2017-07-31 17:26:50 · 363 阅读 · 0 评论 -
第K短路(A*算法)
第K短路对于无向图:SPFA+A*算法:先用SPFA求目标结点到各个结点的最短路径;然后,取g(x)为从初始结点到当前结点x的路径长度,h(x)为从x结点到目标结点的最短路径长度,即h(x)取dis[x]即可,估价函数f(x)=g(x)+h(x)。对于有向图:SPFA+A*算法:显然应将有向边取反,然后求目标节点到各个结点的最短路径;后面和上述一样。代码:struct no原创 2017-08-09 23:13:48 · 1309 阅读 · 0 评论 -
并查集
并查集可以在O(α(n))时间内进行以下两种操作:1)查询元素a和元素b是否属于同一组;2)合并元素a和元素b所在的组;ps:这是“均摊复杂度”,且比O(log(n))还要快;并查集是使用树形结构实现的,为了避免发生退化,采用以下两种优化操作:1)对于每课树,记录这棵树的高度(rank),合并从rank小的向rank大的连边;2)路径压缩,对于每个节点,一旦向上走到原创 2017-08-10 15:32:44 · 184 阅读 · 0 评论 -
二分图最优匹配之KM算法
概念:完全二分图G(X∪Y,X×Y)的最大权和匹配;ps:若集合X和集合Y不是完全二分图或集合X和集合Y的顶点个数不相等,可构造0权值的边或产生0权值的顶点;原理:通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转化为求完备匹配的问题的。设顶点 的顶标为 ,顶点 的顶标为 ,顶点 与 之间的边权为原创 2017-08-03 16:14:30 · 667 阅读 · 0 评论 -
字典树(Trie树)
字典树:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 代码:#define MAX 26 //Trie的数据结构定义:typedef struct Trie {原创 2017-08-03 21:47:37 · 392 阅读 · 0 评论 -
拓扑排序
int indegree[100];queue<int> q;int n,m;bool map[100][100];int a[100];int topo(int n){ int cnt = 1; while(!q.empty()) q.pop(); for(int i = 1; i <= n ; i++) if...原创 2018-05-24 18:17:43 · 343 阅读 · 0 评论