![](https://img-blog.csdnimg.cn/920af1378e2545d7883c5044d9f1ae21.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
每周一算法
文章平均质量分 93
每周介绍一个信息学奥林匹克竞赛常用算法,包含算法思想、应用场景、真题演练,以及相关习题。
少儿编程乔老师
信息学奥林匹克山东省赛区优秀辅导教师,蓝桥杯TOP 1%考生指导教师
展开
-
每周算法:无向图的双连通分量
通过Tarjan算法求无向连通图的双连通分量,计算至少添加多少条边可以将原图变为一个双连通分量。原创 2024-07-06 16:11:18 · 1261 阅读 · 0 评论 -
每周算法:有向图强连通分量
Tarjan算法求有向图的强连通分量。原创 2024-07-02 15:58:32 · 1102 阅读 · 0 评论 -
每周算法:差分约束求最值
差分约束系统是一种特殊的N元一次不等式组,它包含N个变量Xi ~ Xn,以及M个约束条件,每个约束条件都是由两个变量作差构成的,形如Xi-Xj≤Ck,其中Ck是常数(可以是非负数,也可是是负数)。要解决的问题是:求一组解X1=ai,X2=a2,...Xn=an,使所有约束条件都得到满足。原创 2024-06-12 16:29:30 · 712 阅读 · 0 评论 -
每周算法:01分数规划
01分数规划 :01指取还是不取,分数即所求型式为a/b,规划就是选取最好的方案。01分数规划一般采用二分答案的方式求解。原创 2024-06-05 16:02:23 · 786 阅读 · 0 评论 -
每周算法:次小生成树
严格次小生成树是指该次小生成树的总边权严格大于最小生成树的边权之和。如果次小生成树的总边权大于等于最小生成树的边权之和,那么可以称为非严格次小生成树。要求次小生成树,可以先求最小生成树,然后枚举非树边(不在最小生成树中的边),尝试将该边加入树中,同时从树中去掉一条边,保证最终仍然是一棵树。统计所有这些树的边权之和的最小值就是次小生成树。原创 2024-05-30 22:01:35 · 937 阅读 · 0 评论 -
每周一算法:Kruskal算法求最小生成树
Kruskal 算法是一种常见并且好写的最小生成树算法,该算法的基本思想是从小到大加入边。具体来说,维护一个森林,查询两个结点是否在同一棵树中,连接两棵树。这里可以将森林抽象为一堆集合,查询两个元素是否属于同一集合,合并两个集合。其中,查询两点是否连通和连接两点可以使用并查集维护。原创 2024-05-23 12:20:15 · 787 阅读 · 0 评论 -
每周一算法:Prim算法求最小生成树
在一个无向图中求边权和最小的生成树,即无向连通图的最小生成树(Minimum Spanning Tree,MST)。本文介绍使用Prim算法求最小生成树。原创 2024-05-23 11:51:48 · 1088 阅读 · 0 评论 -
每周一算法:恰好经过K条边的最短路
给定一张由M条边构成的无向图,求从起点S到终点E恰好经过K条边(可以重复经过)的最短路。可以使用快速幂倍增 + Floyd 求解。原创 2024-05-15 22:46:22 · 816 阅读 · 0 评论 -
每周一算法:无向图的最小环
给定一张无向图,求图中一个至少包含3个点的环,环上的节点不重复,并且环上的边的长度之和最小。该问题称为无向图的最小环问题,可以使用Floyd算法求解。原创 2024-05-10 15:02:38 · 840 阅读 · 0 评论 -
每周一算法:传递闭包
在交际网络中,给定若干个元素和若干对二元关系,且关系具有传递性。通过传递性推导出尽量多的元素之间的关系,这类问题被称为传递闭包。使用「Floyd」算法可以解决传递闭包问题原创 2024-05-09 15:22:54 · 706 阅读 · 0 评论 -
每周一算法:单源次短路
Dijkstra算法求最短路和次短路的方案数。原创 2024-04-29 22:57:47 · 902 阅读 · 0 评论 -
每周一算法:最短路计数
利用最短路算法构建最短路拓扑序,利用动态规划的思想计算最短路方案数。原创 2024-04-25 21:58:48 · 1039 阅读 · 0 评论 -
每周一算法:多起点最短路
反向建边的思想可以解决从多个起点出发到达终点的最短路问题,但是当终点也有多个时,则无法处理。此时,除了「Floyd」算法之外,还可以使用虚拟源点的思想来处理。虚拟源点的基本思想就是设置一个虚拟源点,从该源点到每个起点建立一条权重为0的边。这样,对于每条从起点到终点的最短路,都可以对应一条从虚拟源点出发,经过起点到达终点的最短路。这样就可以利用单源最短路算法求多起点最短路问题。原创 2024-04-24 10:16:29 · 807 阅读 · 0 评论 -
每周一算法:负环判断
每周一算法:判断负环可以使用Bellman–Ford算法,时间复杂度为O(nm);也可是使用SPFA,它比Bellman-ford要快上许多倍,最好情况下的复杂度是O(km),这里的k是一个小于等于2的常数,最坏情况也是O(nm)。原创 2024-04-18 15:34:09 · 724 阅读 · 0 评论 -
每周一算法:树上差分
每周一算法:树上差分。有m次操作,每次操作要将树中从u到v路径上的每一条边增加一个常数c,可以使用树上差分进行优化。原创 2024-04-10 18:27:57 · 999 阅读 · 0 评论 -
每周一算法:旋转游戏
每一步操作有A~H一共8种选择,状态空间随着深度增加呈指数级别增长,但是答案序列不会太长,为了避免搜索超时,可以使用迭代加深A*(IDA*)实现。在每个状态下,如果中间8个格子里出现次数最多的是x,一共出现了m次,那么其余数字全变成x,至少需要8-m次操作。可以用这个作为预估步数。原创 2024-03-22 14:49:59 · 714 阅读 · 0 评论 -
每周一算法:迭代加深A*
把估价函数与迭代加深的DFS结合就是迭代加深A*(IDA*),基本思想是以迭代加深DFS的搜索框架为基础,把原来简单的深度限制加强为:若当前深度+未来估计步数>深度限制,则立即从当前分支回溯。原创 2024-03-22 10:10:17 · 721 阅读 · 0 评论 -
每周一算法:双向深搜
双向搜索——从初态和状态出发各搜索一半,产生的两棵深度减半的搜索树,在中间交汇、组成最终答案。避免了层数过深时,分支数量的大规模增长。原创 2024-03-15 10:54:03 · 1094 阅读 · 0 评论 -
每周一算法:迭代加深搜索
当搜索树规模随着层次的深入增长很快,并且题目能够确保答案在一个较浅层的节点时,就可使采用迭代加深的深度优先搜索算法来解决问题。其基本思想是从小到大限制搜索的深度,如果在当前深度限制下搜索不到答案,就把深度限制增加,重新进行一次搜索。原创 2024-03-14 23:32:31 · 866 阅读 · 0 评论 -
每周一算法:第K短路
A*算法解决第K短路问题,对每个节点,使用节点到终点的最短路径长度作为预估代价,当终点第K次出队时,就得到了第K短路的长度。原创 2024-03-08 13:19:08 · 943 阅读 · 0 评论 -
每周一算法:A*(A Star)算法
A*(A Star)算法是一种很常用的路径查找和图形遍历算法,它有较好的性能和准确度。A*算法与BFS类似,不同之处在于A*算法使用优先队列,选取优先级最高的状态作为下一个待扩展的状态。原创 2024-03-07 23:20:07 · 1172 阅读 · 0 评论 -
每周一算法:双向广搜
双向广搜,是指从起点和终点同时开始进行BFS,双向奔赴直到找到共同的目标为止。使用双向广搜可以大大减少了要搜索的状态空间,剪枝效果明显。使用双向广搜时要注意:* 在双向广搜时,优先选择队列中状态数量较少的方向来扩展,可以优化搜索效率* 在扩展时,需要将一层的所有节点扩展完,不能只扩展一个点。原创 2024-03-01 15:33:55 · 1049 阅读 · 0 评论 -
每周一算法:双端队列广搜
对于只包含边权0和1的最短路问题,可以使用双端队列广搜求解。与普通的BFS不同的是:如果扩展到的新节点边权为0时,需要把新节点插入队列的头部。原创 2024-03-01 12:46:41 · 1050 阅读 · 0 评论 -
每周一算法:数独游戏
每周一算法:数独游戏。暴力搜索数独的解决方案,优化搜索顺序,可行性剪枝,快速枚举二进制中的1。原创 2024-01-18 20:05:27 · 1102 阅读 · 0 评论 -
每周一算法:倍增法求最近公共祖先(LCA)
最近公共祖先简称 LCA(Lowest Common Ancestor)。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。本文介绍了如何通过倍增法球LCA。原创 2024-01-05 14:04:06 · 1195 阅读 · 0 评论 -
每周一算法:倍增法求区间最大最小值(RMQ)
RMQ 是英文 Range Maximum/Minimum Query 的缩写,表示区间最大(最小)值。本文介绍如何使用倍增思想解决 RMQ 问题。原创 2024-01-05 10:38:46 · 1291 阅读 · 1 评论 -
每周一算法:倍增法查找位置
倍增法(Binary Lifting),顾名思义,就是利用“**以翻倍的速度增长**”的思想来解决问题的一类算法。本文介绍如何使用倍增法在有序的序列中查找满足条件的位置。原创 2024-01-02 11:50:41 · 1038 阅读 · 0 评论 -
每周一算法:区间覆盖
给定N个闭区间,以及一个线段区间,请你选择尽量少的区间,将指定线段区间完全覆盖。原创 2023-12-27 14:58:43 · 1399 阅读 · 0 评论 -
每周一算法:邻值查找
每周一算法:邻值查找,使用set和双链表实现相邻元素的查找。原创 2023-12-26 16:10:47 · 946 阅读 · 0 评论 -
每周一算法:最大连续子序列
每周一算法:最大连续子序列。给出一个长度为n的序列,选出其中连续且非空的一段使得这段和最大,并求解该序列的开始位置和结束位置。原创 2023-12-22 14:53:09 · 892 阅读 · 0 评论 -
每周一算法:最大连续子序列的和
每周一算法:连续子序列的和。给出一个长度为n的序列,选出其中连续且非空的一段使得这段和最大。原创 2023-12-22 11:13:35 · 928 阅读 · 0 评论 -
每周一算法:树形动态规划
每周一算法:树形动态规划,用于处理求树上最优值的问题,一般先递归访问所有子树,再在根上合并。原创 2023-12-15 11:52:32 · 847 阅读 · 0 评论 -
每周一算法:状态压缩动态规划
状态压缩动态规划。状态压缩是指用二进制表示集合的方式对状态进行压缩,将其表示为一个整数。需要借助状态压缩实现状态表示的动态规划问题就称为状态压缩动态规划原创 2020-11-04 09:58:56 · 599 阅读 · 0 评论 -
每周一算法:背包问题(五)求解方案数
每周一算法:背包问题(五)求解方案数。包含01背包、完全背包在不超过背包容量和恰好装满背包时的方案数。原创 2023-12-06 09:15:19 · 839 阅读 · 0 评论 -
每周一算法:背包问题(四)分组背包
每周一算法:背包问题(四)分组背包。算法思想以及时间复杂度分析。原创 2023-12-05 14:05:05 · 887 阅读 · 0 评论 -
每周一算法:背包问题(三)多重背包
每周一算法:背包问题(三)多重背包,算法思想 + 时间复杂度优化。原创 2023-12-04 09:01:11 · 898 阅读 · 0 评论 -
每周一算法:背包问题(二)完全背包
每周一算法:背包问题(二)完全背包,算法思想和时空优化。原创 2023-12-04 08:47:09 · 1113 阅读 · 0 评论 -
每周一算法:背包问题(一)01背包
每周一算法:背包问题(一)01背包,包含算法思想,时间复杂度分析和空间优化。原创 2023-12-04 08:46:28 · 920 阅读 · 0 评论 -
每周一算法:二维差分
要将m块地毯铺在 n×n 的矩阵上,每块地毯会覆盖一个子矩阵,求最终每个格子被多少个地毯覆盖。这样的题目可以用二维差分进行优化。原创 2024-04-28 11:07:41 · 1025 阅读 · 0 评论 -
每周一算法:二维前缀和
对一个序列预处理得到前缀和数组,可以在$O(1)$的时间复杂度计算序列中任意区间的元素之和,这是前缀和算法的作用。而二维前缀和是用来优化处理子矩阵的和。原创 2023-05-23 11:41:00 · 758 阅读 · 0 评论