![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
algorithms
文章平均质量分 85
effewf
这个作者很懒,什么都没留下…
展开
-
SCC缩点
的节点作为根节点,向上拉直,就形成了一棵树(当然,原图可能是不连通的,所以也可能形成森林)。我们知道,在强连通分量中,任意两点可以相互到达,所以对于一个强连通分量,只要有一个节点作为代表即可。的编号建立新的节点,代替相应的强连通分量。:添加若干条有向边,使有向图中任意两点可以相互到达,求这些边数量的最小值。首先,建立一张有向图——学校是节点,学校间的单向线路是有向边。,要使任意两点可以相互到达,那么任意节点的出入度都不能为。任意节点(即不考虑选出的节点),求这些节点数量的最小值。,则满足条件的节点个数为。原创 2024-05-08 16:41:30 · 721 阅读 · 0 评论 -
Tarjan算法模板
LCA。原创 2024-05-07 22:08:27 · 275 阅读 · 0 评论 -
P1020 [NOIP1999 提高组] 导弹拦截
我们可以得到求最长不上升子序列的方法。原创 2024-03-24 20:25:35 · 653 阅读 · 0 评论 -
最长上升子序列
(因为对于相同长度的上升子序列,结尾元素越小,就越有优势)是升序,所以我们可以选择用二分搜索来优化。如果按这个思路,仍然是。原创 2024-03-24 20:07:24 · 864 阅读 · 0 评论 -
拓展欧几里得算法
根据,对任意a和b,一定存在x和y,使axbygcdab。拓展欧几里得算法不仅能求出a和b的最大公约数,而且能找到一对xy使该方程成立。设求解axbygcdab的函数为该函数返回gcdab,即a和b的最大公约数。同时,引用的x和y就是方程的一对解。b0表示的方程为axbygcdab表示的方程为bx′aby′gcdbab我们知道ab是取余运算,可以转换成aba−⌊ba⌋。原创 2024-03-13 15:30:29 · 741 阅读 · 0 评论 -
前缀和算法
有一系列元素Aa0a1...an...,前缀和presumnA0A1⋅⋅⋅An。利用前缀和,我们可以很高效地得到LR的区间和∑iLRAipresumR−presumL−1。原创 2024-02-25 19:51:06 · 856 阅读 · 0 评论 -
SPFA算法
【代码】SPFA算法。原创 2024-02-25 18:40:10 · 362 阅读 · 0 评论 -
树形动态规划
有一棵n个节点组成的树,每个节点ai有一个权值aiworth。求子树的点权值和的最大值。原创 2024-02-25 14:37:19 · 873 阅读 · 0 评论 -
试题 C :直线
【代码】试题 C :直线。原创 2024-02-20 14:23:39 · 814 阅读 · 0 评论 -
字符串匹配——哈希算法
这是一种优化技巧,用于优化字符串的匹配。是否相等,而是比较二者的哈希值。是哈希基数,相当于把字符串看作。进制数(,哈希函数就是将。的子串,它的哈希值为。的子串,它的哈希值为。我们不直接比较字符串。进制转换为十进制)。原创 2024-02-18 19:54:55 · 1304 阅读 · 0 评论 -
P9242 接龙数列
题目要我们求删除数的最小个数。可以转变问题,求能形成的接龙数列的最大长度。由题意可知,我们只需要关注每个数的首、末位数字。原创 2024-02-18 13:43:01 · 985 阅读 · 0 评论 -
求组合数的三种算法
一般是较小的素数)。这时,在使用前两种方法求解。注意:计算过程中可能会溢出,要进行模运算。很大,我们可以通过卢卡斯定理缩小。注:计算逆元时,可以通过。现在,我们的重点是求。原创 2024-02-16 19:35:25 · 2055 阅读 · 0 评论 -
取模的运算
对于∀a∈Rm∈0∞∀a∈Rm∈0∞,求aaa除以mmm的余数的运算,就是取模运算,记作amodma~mod~mamodm。规定0≤amodm≤m−10≤amodm≤m−1。若aaa为负数,则ama~\%~mam可能小于000。此时,对结果进行amma~\%~m+mamm,使取模运算满足规定。若aaa和bbb对mmm。原创 2024-02-12 14:10:30 · 1339 阅读 · 0 评论 -
有关素数的算法
同时,我们知道了一个因数,就能求出另一个因数。该算法的核心思想是判断因数。经过多轮的筛数,留下的就都是素数了。解决该问题需要用到埃氏筛法:先将。原创 2024-02-12 13:02:34 · 904 阅读 · 0 评论 -
最大公约数和最小公倍数
求两个正整数的最大公约数gcd (greatest common divisor),最常用的方法是。原创 2024-02-09 16:32:54 · 813 阅读 · 0 评论 -
传递闭包问题
B3611 【模板】传递闭包首先,要弄清楚传递闭包的定义,由题意:一张图的邻接矩阵定义为一个 n×nn\times nn×n 的矩阵 A=(aij)n×nA=(a_{ij})_{n\times n}A=(aij)n×n,其中aij={1,i 到 j 存在直接连边0,i 到 j 没有直接连边 a_{ij}=\left\{\begin{aligned}1,i\ 到\ j\ 存在直接连边\\0,i\ 到\ j\ 没有直接连边 \\\end{aligned}\right.aij={1,i 到 j原创 2024-02-08 21:00:48 · 1183 阅读 · 0 评论 -
差分约束算法
上文提到,差分约束问题可以用最短路径求解,所以,我们也用一个数组。差分约束问题的典型特征是一组不等式。,这类问题都可以准换为最短路径问题。为起点,并初始化为 0。) = 一个未知数对应一个顶点(接着,用最短路径算法求。) + 一个额外的顶点(原创 2024-02-08 16:21:17 · 958 阅读 · 0 评论 -
次短路径问题
因此,我们需要求出所有顶点的最短路径和次短路径。如果求最短路径,我们很自然会想到。但是,这道题要求的是次短路径。,只是多维护一个次短路径数组。原创 2024-02-06 17:00:57 · 961 阅读 · 1 评论 -
Kruskal算法
因为图是连通的,所以最小生成树会覆盖所有的顶点,即。初始状态就覆盖所有顶点,每个顶点各自为一棵树)。为了得到最小生成树,我们采用贪心策略,每次都从。条边的无向图,且是连通图,求最小生成树。各自所在的两棵树要合并成一棵树。从森林变成一棵树,我们需要从。还不在一棵树上,就将该边加入。为了能够高效地合并树,我们采用。是一种求最小生成树的算法。已经覆盖了所有顶点,所以。原创 2024-02-06 14:13:04 · 823 阅读 · 1 评论 -
并查集的实现
该函数用于合并两个元素所在的集合,核心思想是把一棵树的根节点的父节点改为另一棵树的根节点。这里有两点要注意:第一,要把深度小的树合并到深度大的树中,这样可以防止退化;第二,若合并两棵深度一样的树,合并后,树的深度要加1。的根节点,采用了递归的思想。注意,这里采用了路径压缩,每次查询时,把树中的节点都直接连接到根节点上。首先,要对每一个元素初始化。一开始还未对元素进行分类,所以每个元素独自为一棵树,该函数用于判断两个元素是否属于同一集合,只要查询各自的根节点是否相同就行了。此时,每棵树的深度都为0,原创 2024-02-06 13:51:43 · 835 阅读 · 1 评论 -
Prim算法
因为图是连通的,所以最小生成树会覆盖所有的顶点,即。,依据贪心策略,我们要挑选权值最小的边加入。条边的无向图,且是连通图,求最小生成树。算法是一种求最小生成树的算法。的边中挑选权值最小的边。继续生长为最小生成树。原创 2024-02-05 23:10:52 · 790 阅读 · 1 评论 -
最短路径中的分层图
表明我们可以令某一条边的权值为0,换句话来说,就是为某条边添上一条权值为0的重边。因为每一条边都有可能被选到,所以图中的每一条边都应该有一条这样的重边。但是,如果我们将重边直接添在原图上,就只能表示一次选择(某条边的权值为0)。所以,我们要创建原图的副本,要做。为了与原图有区别,我们需要对副本的顶点按顺序重新编号。个顶点,且是无向图)的到下一层图的重边就变成了。显然,这是一道最短路径的题目,我们可以选择。有了分层图的模型,接下来,我们就来具体实现。有了分层图,我们就能很轻松地解决本题了。原创 2024-02-05 12:33:07 · 864 阅读 · 1 评论 -
最短路径问题
因此,我们改变策略,只对已经找到最短路径的顶点,以该顶点为起点的边进行松弛。我们的重点是如何确定已经找到最短路径的点。一开始,我们只确定了起点的最短路径。肯定也不是正确结果。在这种情况下,进行松弛是没有必要的,除非。中,只要满足松弛条件,我们就进行。可能有重边,所以用集合形式表示。但是,在算法执行的过程中,如果。最接近的点就是我们要找的顶点。为起点的所有边的集合;为起点的所有边的集合;到每个点的最短路径。到每个点的最短路径。原创 2024-02-03 19:25:52 · 712 阅读 · 1 评论 -
一些cpp注意事项
【代码】一些cpp注意事项。原创 2024-01-31 14:04:16 · 342 阅读 · 1 评论 -
背包问题的空间优化
动态规划的核心是先记录,再访问。如果访问过后,数据就不要再需要了,那么覆盖这条记录也不会对结果造成影响。因此,我们只使用一个一维数组。因为是从左向右的循环,所以肯定影响后来的计算。与01背包比较,通过该方法优化后,二者代码的区别仅在。的物品,求所有挑选方案中价值总和的最大值。的物品,求所有挑选方案中价值总和的最大值。从这些物品中挑选出总重量不超过。从这些物品中挑选出总重量不超过。因此,我们只要用一个。计算,则能避免这样的问题。,我们可以发现,虽然。就能实现原来的功能。原创 2024-01-30 19:27:35 · 877 阅读 · 1 评论 -
完全背包问题
显然,完全背包问题与01背包问题的唯一区别:完全背包问题中的物品个数不是唯一的。对于完全背包来说,物品不止一个,在满足一定的条件下,可以取任意多个,即。虽然我们得到了完全背包的递推式,但是它很复杂,接下来对它进行变形。可以发现,因为01背包中的物品只有一个,所以最多只能拿一个。的物品,求所有挑选方案中价值总和的最大值。从这些物品中挑选出总重量不超过。是与01背包唯一不同的地方,即。后,目的是找到集合中的最大值。原创 2024-01-30 15:15:34 · 896 阅读 · 1 评论 -
01背包问题
执行了两次,这显然造成了浪费。如果能把第一次的结果记录下来,那么就避免了第二次的计算。一般,我们可以先写出搜索算法,再得到递推式;不难看出,与暴力搜索相比,记忆化搜索在原来的基础上,只不过多了。值得注意的是,记忆化数组必须开得足够大。提到的函数递归式,我们可以写出动态规划的递推式。,把搜索过程中的结果记录下来,避免重复的搜索。的物品,求所有挑选方案中价值总和的最大值。,所有挑选方案中价值总和的最大值。我们用一组数据来看一下暴力搜索的过程。有了递推式,我们就可以通过循环来计算。个物品,最后一个物品的编号为。原创 2024-01-29 16:25:24 · 855 阅读 · 0 评论 -
高精度运算
【代码】高精度运算。原创 2023-12-03 20:05:26 · 367 阅读 · 1 评论 -
什么是差分数组?
对于数组A[n]diffiAii0Ai−Ai−10indiffiAiAi−Ai−1i==00in显然,通过差分数组diff[n],可以求得A[n]Aidiffii0diffiAi−10inAidiffidiffiAi−1i==00in。原创 2023-12-02 16:37:15 · 766 阅读 · 1 评论 -
Hoare快速排序的Partition实现
开始遍历,直至 i == j,结束循环三。因不满足交换一的条件,所以结束循环一。同时满足三个条件,在循环一结束后,执行交换二,则达到算法的目的。因此,进行交换二,使 A[i] == x,则达成目的。:如伪代码中注释所写,对各个循环和交换操作取一个名称。先遍历,所以)此时已经结束一轮循环(执行过交换一),因不满足交换一的条件,所以结束循环一。,未达到算法的目的。因此,进行交换二,使。仍执行循环三,则循环一结束时。为什么三个循环结束的条件是。已结束循环二,即此时。已结束循环三,(因为。原创 2023-11-19 14:31:05 · 203 阅读 · 1 评论