![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
algorithm
文章平均质量分 57
小鸡炖蘑菇_
stay hungry,stay foolish.
展开
-
用于求最近公共祖先(LCA)的 Tarjan算法–以POJ1986为例(转)
原文地址:https://comzyh.com/blog/archives/492/给定有向无环图(就是树,不一定有没有根),给定点U,V,找出点R,保证点R是U,V的公共祖先,且深度最深;或者理解为R离这两个点的距离之和最小.如何找出R呢?最一般的算法是DFS(DFS本是深度优先搜索,在这里姑且把深度优先遍历也叫做DFS,其实是一种不严谨的说法).先看一道赤裸裸的LCA:POJ 1330 Near转载 2016-10-30 21:11:27 · 837 阅读 · 1 评论 -
数据结构之堆(Heap)
详情见代码中的注释/** 堆的性质* 堆中某个节点的值总是不大于或不小于其父节点的值(小顶堆或大顶堆)* 堆总是一棵完全二叉树 * * 由于堆是一个完全二叉树,所以我们可以用数组模拟树* 第i个结点的父结点是第i/2个结点* 第i个结点的左子女是第2*i个结点* 第i个结点的右子女是第2*i+1个结点* * 堆的应用* 堆排序 优先队列 *///------------原创 2016-06-19 15:46:42 · 895 阅读 · 0 评论 -
数据结构之二叉排序树
二叉排序树(Binary Search Tree),又称二叉查找树、二叉搜索树 定义: 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树; (4)没有键值相等的结点。#include <iostream>#incl原创 2016-06-18 22:57:52 · 1602 阅读 · 1 评论 -
数据结构之平衡树(Treap)
平衡树是二叉搜索树和堆合并构成的新数据结构,所以它的名字取了Tree和Heap各一半,叫做Treap。 堆和树的性质是冲突的,二叉搜索树满足左子树<根节点<右子树,而堆是满足根节点小于等于(或大于等于)左右儿子。因此在Treap的数据结构中,并不是以单一的键值作为节点的数据域。Treap每个节点的数据域包含2个值,key和weight。 key值,和原来的二叉搜索树一样,满足左子树<根节点<右子原创 2016-06-19 17:46:12 · 26661 阅读 · 8 评论 -
最小费用最大流模板
最小费用最大流一般用邻接表来实现,因为邻接矩阵不能处理平行边等等;而一条有向边是要储存两条信息,无向图的话要拆成两条有向边处理,相当于变为4条边,这也是邻接矩阵不能做到的然后最小费用最大流的原理就不讲了,讲一下实现的要注意的问题和一些技巧1.用结构体数组来保存边,最好从下标0开始保存不要从下标1开始保存,因为增广的时候需要用到位运算,从下标1保存不利于位运算2.记录路径:如果是邻接矩阵记录前驱p[v原创 2016-05-18 22:46:56 · 1253 阅读 · 0 评论 -
模线性方程组
先说一个故事 说秦末,刘邦的将军韩信带领1500名士兵经历了一场战斗,战死四百余人。韩信为了清点人数让士兵站成三人一排,多出来两人;站成五人一排,多出来四人;站成七人一排,多出来六人。韩信立刻就知道了剩余人数为1049人。这就是著名的韩信点兵的故事,化成数学模型就是: 韩信是为了计算的是士兵的人数,那么我们设这个人数为x。三人成排,五人成排,七人成排,即x mod 3, x mod 5, x原创 2016-05-07 22:19:01 · 3375 阅读 · 0 评论 -
欧几里德与扩展欧几里德算法
欧几里德算法欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。第一种证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a原创 2015-08-20 14:18:33 · 1514 阅读 · 0 评论 -
母函数(Generating function)详解(转)
在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。母函数可分为很多种,包括普通母函数、指数母函数、L级数、贝尔级数和狄利克雷级数。对每个序列都可以写出以上每个类型的一个母函数。构造母函数的目的一般是为了解决某个特定的问题,因此选用何种母函数视乎序列本身的特性和问题的类型转载 2015-08-19 20:53:46 · 594 阅读 · 0 评论 -
约瑟夫问题的几种解法
问题来历据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个原创 2016-04-18 22:22:57 · 2577 阅读 · 1 评论 -
Dinic算法的原理与构造(转)
为了更好的介绍Dinic算法,我们先来介绍最短增广路算法。最短增广路算法1、顶点的层次和层次网络顶点的层次:在残留网络中,把从源点到顶点u的最短路径长度(该长度仅仅是值路径上边的数目,与容量无关),称为顶点u的层次,记为level(u)。源点Vs的层次为0。将残留网络中所有的顶点的层次标注出来的过程称为分层。注意:(1)对残留网路进行分层后,弧可能有3种可能的情况。1、从第i层顶点指向第i+1层顶点转载 2016-05-01 19:05:34 · 5285 阅读 · 3 评论 -
HDU-1023 -Train Problem II(卡特兰数)
Problem DescriptionAs we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasing order, how many orders that all the trains can get原创 2015-12-23 16:22:37 · 1279 阅读 · 1 评论 -
错排公式(转)
n各有序的元素应有n!种不同的排列。如若一个排列式的所有的元素都不在原来的位置上,则称这个排列为错排。任给一个n,求出1,2,……,n的错排个数Dn共有多少个。 递归关系式为:D(n)=(n-1)(D(n-1)+D(n-2)) D(1)=0,D(2)=1 可以得到: 错排公式为 f(n) = n![1-1/1!+1/2!-1/3!+……+(-1)^n*1/n!] 其中,n!=1*2*3*转载 2016-04-14 22:54:23 · 362 阅读 · 0 评论 -
判断素数的几种方法的总结
素数,又称质数,定义是:除了1和它本身以外不再有其他的除数整除。方法一按照定义,从2到n-1判断有没有能整除n的数。如果有,则不是素数,否则,是素数bool is_prime(int n){ if (n < 2){ return false; } int i; for (i = 2; i < n; i++){ if (n%i == 0)原创 2016-04-09 22:36:56 · 57300 阅读 · 9 评论 -
最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝尔曼(Richard Bellman, 动态规划的提出者)和小莱斯特•福特(Lester Ford)发明。Bellma转载 2015-08-25 16:28:44 · 807 阅读 · 0 评论 -
次小生成树
最小生成树设G=(V, E,ω)是连通的无向图,T是图G的一个最小生成树。如果有另一棵树T1,满足不存在树T’,T’≠T, ω(T’)<ω(T1),则称T1是图G的次小生成树。定理定理:设T是图G的最小生成树,如果T1满足ω(T1)=min{ω(T’)| T’∈Not(T)},则T1是G的次小生成树。也就是说,最小生成树邻集中权值和最小的一棵生成树即为该图的次小生成树。证明: 可以证明下面一个强原创 2016-08-09 13:24:17 · 327 阅读 · 0 评论 -
最小度限制生成树
设G=(V, E, ω)是连通的无向图,v0 ∈V是特别指定的一个顶点,k为给定的一个正整数。如果T是G的一个生成树且dT(v0)=k,则称T为G的k度限制生成树。G中权值和最小的k度限制生成树称为G的最小k度限制生成树明确几个概念 T为图G的一个生成树,T+a-b记作(+a,-b),如果T+a-b仍然是一个生成树,则称(+a,-b)是T的一个可行交换。T为图G的一个生成树,由T进行一次可行交换得原创 2016-08-09 19:26:05 · 4093 阅读 · 0 评论 -
KM算法详解+模板(转)
KM算法用来求二分图最大权完美匹配。 本文配合该博文服用更佳:趣写算法系列之–匈牙利算法现在有N男N女,男生和女生每两个人之间有好感度,我们希望把他们两两配对,并且最后希望好感度和最大。 怎么选择最优的配对方法呢?首先,每个妹子会有一个期望值,就是与她有好感度的男生中最大的好感度。男生呢,期望值为0,就是,,,只要有一个妹子就可以啦,不挑~~这样,我们把每个人的期望值标出来。 然后,开转载 2016-10-29 20:28:17 · 728 阅读 · 0 评论 -
图论算法总结
网络流 Dinic算法约瑟夫问题匈牙利算法最小费用最大流字符串 最长回文串KMP算法最长递增子串最大公共子串树状数组线段树字典树莫队算法树形dp背包问题最短路 Dijkstra算法和Floyd算法spfa算法Bellman-Ford算法最小生成树并查集原创 2016-05-18 19:44:29 · 2767 阅读 · 0 评论 -
Hopcroft-Harp 算法
匈牙利算法原理 为了降低时间复杂度,可以在增广匹配集合M时,每次寻找多条增广路径。这样就可以进一步降低时间复杂度,可以证明,算法的时间复杂度可以到达O(sqrt(n)*m)。 基本算法 该算法主要是对匈牙利算法的优化,在寻找增广路径的时候同时寻找多条不相交的增广路径,形成极大增广路径集,然后对极大增广路径集进行增广。在寻找增广路径集的每个阶段,找到的增广路径集都具有相同的长度,且随着算法的进行转载 2016-10-29 17:02:00 · 982 阅读 · 0 评论 -
混合图的欧拉回路求解方法(转)
原文地址http://yzmduncan.iteye.com/blog/1149049基础知识 欧拉回路是图G中的一个回路,经过每条边有且仅一次,称该回路为欧拉回路。具有欧拉回路的图称为欧拉图,简称E图。 无向图中存在欧拉回路的条件:每个点的度数均为偶数。 有向图中存在欧拉回路的条件:每个点的入度=出度。 欧拉路径比欧拉回路要求少一点: 无向图中存在欧拉路径的条件:每个点的度数均为偶数或者转载 2016-10-29 13:16:05 · 1477 阅读 · 0 评论 -
格雷码
格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同。 例如以下为3位元的格雷码: 000 001 011 010 110 111 101 100 。 如果要产生n位元的格雷码,那么格雷码的个数为2^n. 十进制 葛雷码 二进制 0 000 000 1 001 001 2 011原创 2016-10-19 13:52:20 · 1037 阅读 · 0 评论 -
计算逆矩阵
/** 时间复杂度 O(n^3)* 输入 a 原矩阵* c 逆矩阵* n 矩阵的阶数* * 函数说明:将原矩阵a和一个单位矩阵E作成一个大矩阵(a,E),* 用初等变换将大矩阵中的a变成E,则会得到(E,a-1)的形式*/vector<double> operator * (vector<double> a, double b){ int n = a.原创 2016-10-05 14:51:50 · 2371 阅读 · 0 评论 -
gauss消元
高斯消元法(或译:高斯消去法)(英语:Gaussian Elimination),是线性代数中的一个算法,可用来为线性方程组求解,求出矩阵的秩,以及求出可逆方阵的逆矩阵。当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。/* * * 函数说明 * * 将方程做成一个矩阵,再利用三种矩阵初等变换 * 得到上三角矩阵,最后回代得到解集 * * * 时间复杂度 O(n^3) *原创 2016-10-05 09:04:00 · 457 阅读 · 0 评论 -
理解A*寻路算法具体过程(转)
这两天研究了下 A* 寻路算法, 主要学习了这篇文章, 但这篇翻译得不是很好, 我花了很久才看明白文章中的各种指代. 特写此篇博客用来总结, 并写了寻路算法的代码, 觉得有用的同学可以看看. 另外因为图片制作起来比较麻烦, 所以我用的是原文里的图片. 当然寻路算法不止 A* 这一种, 还有递归, 非递归, 广度优先, 深度优先, 使用堆栈等等, 有兴趣的可以研究研究~~简易地图 如图所示简易地图转载 2016-10-27 20:05:42 · 577 阅读 · 1 评论 -
欧拉函数(转)
对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。例如euler(8)=4,因为1,3,5,7均和8互质。 Euler函数表达通式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数,x是不为0的整数。euler(1)=1(唯一和1互质的数就是1本身)。 欧拉公式的延伸:一个数的所有质因子之和原创 2016-04-09 13:08:55 · 386 阅读 · 0 评论 -
中国剩余定理(转)
中国剩余定理介绍 在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?”这个问题称为“孙子问题”,该问题的一般解法国际上称为“中国剩余定理”。具体解法分三步:找出三个数:从3和5的公倍数中找出被7除余1的最小数15,从3和7的公倍数中找出被5除余1 的最小数21,最后从5和7的公倍数中找出除3余1转载 2016-10-15 20:03:57 · 277 阅读 · 0 评论 -
求乘法逆元
乘法逆元,是指数学领域群G中任意一个元素a,都在G中有唯一的逆元a‘,具有性质a×a’=a’×a=e,其中e为该群的单位元。(百度百科的解释,鬼才能看懂┑( ̄Д  ̄)┍)我理解的乘法逆元是,若a*b≡1(mod p),则b是a的乘法逆元,a是b的乘法逆元,b也可以写成a-1乘法逆元有什么用呢? 在取模运算中,有a*b%p=(a%p) * (b%p) 但是没有(a/b)%p=(a%p)/(b%p)原创 2016-10-25 13:31:45 · 788 阅读 · 0 评论 -
割点和桥
点连通度与边连通度 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。一个图的点连通度的定义为,最小割点集合中的顶点数。 类似的,如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称这个点集为割边集合。一个图的边连通度的定义为,最小割边集合中的边数。双连通图、割点与桥 如果一个无向连通图的点连通原创 2016-10-21 21:45:41 · 656 阅读 · 0 评论 -
求最长回文串的几种方法
1. 暴力法先求出每个子串,然后再判断这个子串是不是回文串 求出每个子串的复杂度数O(N2),判断一个子串是不是回文串的复杂度是O(N),所以这个算法的复杂度就是O(N3)#include <bits/stdc++.h>using namespace std; const int MAX = 100001; char str[MAX];int len;int fun(){ i原创 2016-04-14 11:00:15 · 1175 阅读 · 2 评论 -
小Z的袜子(莫队算法)
试题来源 2010中国国家集训队命题答辩 问题描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的原创 2016-01-24 20:43:47 · 724 阅读 · 0 评论 -
博弈知识汇总(转)
有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个 人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏 ,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够 取胜。(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规 定每次至少取一个,最多取m个。最后取光者得胜。显然,如果n=m+1转载 2015-08-19 21:06:38 · 392 阅读 · 0 评论 -
快速幂取模
问题定义:数论中经常出现的一个问题是对一个数的幂取模,也称为模取幂,即求a^b mod n。如果计算量较小,可以直接计算出a^b的值,再作模n运算。但是如果a和b的值都非常大,a^b的值用计算机难以表示,或者即使可以用大数运算的方式用计算机表示,也会因为耗时过长难以应用。基于模运算的基本性质,可以设计出一种算法,快速求解这一问题。这种方法为“快速幂取模”,也称为“反复平方法“。算法原理:算法基础在于原创 2015-08-20 15:02:22 · 473 阅读 · 0 评论 -
大数相加
以前在网上看大数相加的代码,基本上都是用字符数组写的。今天突然想试试用C++中的string能不能写,写了之后感觉比用字符串写略微简单,先上代码吧大数相加的函数void add(string &a, string &b, string &c){ int lena = a.length(), lenb = b.length(); int i, j; c = ""; s原创 2015-08-20 21:42:12 · 432 阅读 · 0 评论 -
背包之01背包、完全背包、多重背包详解(转)
首先说下动态规划,动态规划这东西就和递归一样,只能找局部关系,若想全部列出来,是很难的,比如汉诺塔。你可以说先把除最后一层的其他所有层都移动到2,再把最后一层移动到3,最后再把其余的从2移动到3,这是一个直观的关系,但是想列举出来是很难的,也许当层数n=3时还可以模拟下,再大一些就不可能了,所以,诸如递归,动态规划之类的,不能细想,只能找局部关系。 (引至杭电课件:DP最关键的就是状态,在DP转载 2015-08-16 16:12:59 · 1225 阅读 · 1 评论 -
字典树(转)
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。 字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没转载 2015-08-16 20:54:50 · 383 阅读 · 0 评论 -
最长上升子序列 LIS(Longest Increasing Subsequence)(转)
引出:问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…<sn并且这个子序列的长度最长。输出这个最长的长度。(为了简化该类问题,我们将诸如最长下降子序列及最长不上升子序列等问题都看成同一个问题,其实仔细思考就会发现,这其实只是<符号定义上的问题,并不影响问题的实质) 例如有一个序列:转载 2015-08-16 21:02:15 · 345 阅读 · 0 评论 -
动态规划算法
一、基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优转载 2015-08-17 19:39:46 · 416 阅读 · 0 评论 -
求所有最大公共子序列的算法实现(转)
最近看了很多关于LCS(Longest common subsequence problem,最长公共子序列)的文章,大部分问题都只是求出最大公共子序列的长度,或者打印处其中的任意一个最大子序列即可,但是如何快速的打印出所有的最大长度子序列?这个问题好像看到的不多。本文给出了传统的DP(dynamic programming,动态规划)算法进行求解的过程,并用c语言实现。另外参考一篇论文实现了其中的转载 2015-08-17 21:10:20 · 1901 阅读 · 0 评论 -
动态规划求最长递增子序列
最长递增子序列问题是一个很基本、较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法。由于这个问题能运用学过的基本的算法分析和设计的方法与思想,能够锻炼设计较复杂算法的思维,我对这个问题进行了较深入的分析思考,得出了几种复杂度不同算法,并给出了分析和证明。一, 最长递增子序列问题的描述设L=<a1,a2,…,an>是n个不同的实数的序列,L原创 2015-08-18 18:37:24 · 6168 阅读 · 1 评论 -
并查集详解 (转)
来看一个实例,杭电1232畅通工程 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块。像畅通工程这题,问还需要修几条路,实质就是求有几个连通分支。如果是1个连通分支,说明整幅图上的点都连起来了,不用再修路了;如果是转载 2015-08-14 19:49:59 · 412 阅读 · 0 评论