努力的老周
一个老码农,中年大叔。打过工,做过老板。
现有神兽一枚,努力培养神兽中。
展开
-
图论 —— 强连通分量
如上图所示的一个有向图。我们可以将所有的边分为444种类型。树边(tree edge):示意图中以黑色边表示,每次搜索找到一个还没有访问过的结点的时候就形成了一条树边。反祖边(back edge):示意图中以红色边表示(即7→17 \to 17→1),也被叫做回边,即指向祖先结点的边。横叉边(cross edge):示意图中以蓝色边表示(即9→79 \to 79→7),它主要是在搜索的时候遇到了一个已经访问过的结点,但是这个结点并不是当前结点的祖先。原创 2023-02-18 15:52:42 · 973 阅读 · 0 评论 -
动态规划 —— 线性DP —— 最长上升子序列(LIS)
对于最长上升子序列问题(LIS),我们有两种解法。第一种。线性DP,时间复杂度为 $O(N^2)$。第二种。维护一个类似单调栈数据,时间复杂度为 $O(NlogN)$。原创 2022-06-03 14:33:59 · 430 阅读 · 0 评论 -
背包问题(Knapsack Problem)—— 完全背包问题 —— (1)背包价值最大
和 01 背包相比,完全背包问题唯一的区别就是没有限制物品的数量。也就是说,每个物品的数量是无限的。而 01 背包是限制每个物品只有且只有唯一一件。因此,完全背包问题,就是一个简单的动态规划问题。我们可以知道对于第 iii 件物品而言,我们有两个选择:选或者不选。使用动态规划的思想,这样我们可以得出如下的状态转移方程:但是,对于完全背包,由于物品数量无限。我们将使用正序推导。我们现在有如下的样例数据:背包的总重量为 101010,物品有 444 件:这样,开始的时候,动态规划数组 fff 对应数据如下原创 2022-06-02 11:02:06 · 463 阅读 · 0 评论 -
背包问题(Knapsack Problem)—— 0/1 背包问题 —— 路径问题
背包路径该问题是在标准 0/1 背包上增加了保存路径功能。一般对此类问题,我们采用逆序的方法,也就是在历史记录中,保存父亲是谁。通过保存一个二维 path 数组,第一维表示物品个数,第二维表示背包重量。在完成 0/1 背包的过程中,保存历史即可。样例数据分析下面我们对如下输入数据进行分析10 52 62 36 55 44 6W=10W=10W=10,表示背包总重量为 101010n=5n=5n=5,表示一共有 555 件物品。第 111 件物品 w=2, v=6w=2,原创 2022-05-24 15:15:00 · 542 阅读 · 0 评论 -
背包问题(Knapsack Problem)—— 0/1 背包问题 —— 总价值最大问题
0/1背包问题(0/1 Knapsack Problem)“0/1”的意思是:每个物品只会放入背包零个或者一个。一个物品只能整个放入背包,要不就不放入背包。物品是无法切割的。0/1背包问题的关键点,在于如何有效利用背包剩余重量,找出最好的物品组合方式。0/1背包问题是经典的 NP-complete 问题,无法快速求得精确解,只能折衷求得近似解。然而,当数值范围不大时,可以用动态规划快速求得精确解。让背包里物品总价值最大这也是 0/1 背包问题的最常见问题。我们可以知道对于第 iii 件物品而言,原创 2022-05-23 16:02:03 · 1125 阅读 · 0 评论 -
背包问题(Knapsack Problem)—— 序言
背包问题(Knapsack Problem)什么是背包问题将一群物品放入一个背包中,令背包里面的物品价值最高。用数学术语来说,背包问题就是选择一个最理想的物品子集合,在符合重量限制的前提下,求最大的利益。分数背包问题(Fractional Knapsack Problem)分数(Fractional)的意思,就是一个物品可以切下一个部分,只取某个部分放入背包。这样的问题,我们可以指定一个贪心(Greedy)策略:价值与重量的比值最高的物品,优先放进背包。这样的策略,时间复杂度为 O(N)O(N原创 2022-05-23 15:32:04 · 462 阅读 · 0 评论 -
算法竞赛中涉及的数据结构模板
前言这里总结的模板主要是用于算法竞赛,而不是用于面试或者实际工作。我们需要明白,算法竞赛中追求的是时间,也就是在最快的时间内完成特定的任务。而实际工作中,讲求的是稳定性,通用性。这是两个完全不同的领域。最大的一个区别有两个。区别一在实际代码中,我们经常看到动态内存申请。比如对二叉树的定义,实际项目中使用如下//定义如下struct BTREE { t_type vale; BTREE *lchild, *rchild;};//使用如下BTREE *root=new BTREE;.原创 2021-10-14 11:40:49 · 670 阅读 · 0 评论 -
图论 —— 单源最短路
最短路算法的知识图谱如下。图待补充。单源最短路径(single source shortest path SSAP)给定一个带权有向图 G=(V,E)G=(V,E)G=(V,E),其中每条边的权是一个实数。另外,还给定 VVV 中的一个顶点,称为源。要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径问题。SSAP 中,我们需要掌握三种算法:Dijkstra 算法。Bellman-Ford 算法。SPFA 算法。下面我们来学习一下这三个算原创 2022-02-04 14:45:19 · 364 阅读 · 0 评论 -
从欧几里得到扩展欧几里得到裴蜀定理再到扩展中国剩余定理
欧几里得算法欧几里得算法,又称辗转相除法。用于计算两个整数 a,ba,ba,b 的最大公约数。基本算法思路(来自离散数学)为:设 a=bq+ra=bq+ra=bq+r,其中 a,b,q,ra,b,q,ra,b,q,r都是整数。则 gcd(a,b)=gcd(b,r)\text{gcd}(a,b)=\text{gcd}(b,r)gcd(a,b)=gcd(b,r),即 gcd(a,b)=gcd(b,a%b)\text{gcd}(a,b)=\text{gcd}(b,a\%b)gcd(a,b)=gcd(b,a%原创 2022-05-07 18:11:24 · 354 阅读 · 0 评论 -
图论 —— SPFA 模板
概述本文使用优先队列优化的 SPFA 算法。时间复杂度一般为 O(m)O(m)O(m),最坏为 O(nm)O(nm)O(nm)。使用场合求单源最短路径。支持负权边,但是不能有负权回路。对比 Dijkstra 算法基本可以替代 Dijkstra 算法,而且还支持负权边,速度比 Dijkstra 算法快。除非出题人卡数据。数组版数据定义const LL INF=0x3f3f3f3f3f3f3f3f;//顶点相关const int N=1e3+10;bool vis[N];//可见性原创 2022-02-06 15:54:36 · 216 阅读 · 0 评论 -
图论 —— 图的存储
概述图论相关题目难度在于建图,也就是将题目的内容,使用合适的数据结构来存储。图的存储有以下几种方法:邻接矩阵。邻接表。链式前向星。邻接矩阵顾名思义,就是使用一个二维数组来描述一个图。一般用于稠密图。a[i][j]=0a[i][j]=0a[i][j]=0 的时候,表示顶点 iii 到顶点 jjj 没有通路。a[i][j]=wa[i][j]=wa[i][j]=w 的时候,表示顶点 iii 到顶点 jjj 有一条权值为 www 的边。优点简单,速度快。缺点适用于稠密图。在算法竞赛原创 2022-02-05 14:07:49 · 962 阅读 · 0 评论 -
OI中的超级快读
超级快读使用 getchar() 来读取。但是只能读取数字。代码实现template <typename T>inline T read() { T x = 0, f = 1; char ch = getchar(); while (!isdigit(ch)) { if(ch=='-') { f = -1; ch = getchar(); } } while (原创 2022-02-21 08:37:56 · 993 阅读 · 0 评论 -
图论 —— 二分图的最大匹配
基本概念二分图的匹配给定一个二分图 GGG,在 GGG 的一个子图 MMM 中,MMM 的边集 {E}\{E\}{E} 中的任意两条边都不依附于同一个顶点,则称 MMM 是一个匹配。二分图的最大匹配所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。最大匹配分类问题可以分为:没有权值匹配和有权值匹配。其中有权值匹配,又有两类问题:最大匹配和最小匹配。无权值匹配问题有六位教师:张、王、李、赵、孙、周,要安排他们去教六门课程:数学、化学、物理、语文、英语和程序设计。原创 2022-02-08 13:32:16 · 587 阅读 · 0 评论 -
图论 —— Kruskal 算法求最小生成树
概述Kruskal 算法是一种常见并且好写的最小生成树算法,由 Kruskal 发明。该算法的基本思想是从小到大加入边。算法实现基于贪心算法。对于一个拥有 nnn 个顶点 mmm 条边的图,其最小生成树包括 n−1n-1n−1 条边。这个可以使用归纳法证明。具体证明过程,可以参考《算法导论》。最小生成树过程时间复杂度O(mlogm)O(mlogm)O(mlogm),适用于稀疏图。即当 m<n2m < n^2m<n2 时候使用。前置知识Kruskal 算法需要并查集支持的原创 2022-02-06 20:58:43 · 627 阅读 · 0 评论 -
图论 —— 拓扑排序
拓扑排序基本概念在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:每个顶点出现且只出现一次。若存在一条从顶点 AAA 到顶点 BBB 的路径,那么在序列中顶点 AAA 出现在顶点 BBB 的前面。有向无环图(DAG)才有拓扑排序,非 DAG 图没有拓扑排序一说。例如,下面这个图,它是一个 DAG 图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法:原创 2022-02-11 19:07:24 · 612 阅读 · 0 评论 -
图论 —— 多源最短路
多源最短路相比较与单源最短路问题,多源最短路问题简单了很多。多源最短路只有一个 Floyd 算法。Floyd 算法其实是使用动态规划的思想实现的,核心是三重循环。设定nnn 表示图中顶点数据定义const LL INF=0x3f3f3f3f3f3f3f3f;//d[i][j] 表示从顶点i到顶点j的最短路径//初始值d,就是邻接矩阵中所有值的边LL d[N][N];初始化d for (LL i=1; i<=n; i++) { for (LL j=1;原创 2022-02-05 12:38:32 · 795 阅读 · 0 评论 -
学习线段树(Segment Tree)
Segment Tree 线段树Segment ABCWhat is segment tree 什么是线段树线段树是一种二叉搜索树,什么叫做二叉搜索树,首先满足二叉树,每个结点度小于等于二,即每个结点最多有两颗子树,何为搜索,我们要知道,线段树的每个结点都存储了一个区间,也可以理解成一个线段,而搜索,就是在这些线段上进行搜索操作得到你想要的答案。下图是一个长度为 777 的线段树样子。What can segment tree do线段树是算法竞赛中常用的用来维护 区间信息 的数据结构。线原创 2022-05-16 22:00:27 · 434 阅读 · 0 评论 -
图论 —— 染色法判断二分图
二分图定义二分图,又称二部图,英文名叫 Bipartite graph。二分图是什么?节点由两个集合组成,且两个集合内部没有边的图。换言之,存在一种方案,将节点划分成满足以上性质的两个集合。二分图性质如果两个集合中的点分别染成黑色和白色,可以发现二分图中的每一条边都一定是连接一个黑色点和一个白色点。二分图不存在长度为奇数的环。判定二分图我们可以使用 DFS 或者 BFS 来遍历图,根据二分图的性质来判定。由于 DFS 代码相对较少,我们一般使用 DFS 来判断二分图。这个方法称为染色法。原创 2022-02-07 11:41:15 · 900 阅读 · 0 评论 -
图论 —— Dijkstra 算法模板
概述本文是使用优先队列优化的 Dijkstra 算法。对应的时间复杂度为:O(mlogn)O(mlogn)O(mlogn)。数组版数据定义const LL INF=0x3f3f3f3f3f3f3f3f;//顶点相关const int N=1e3+10;bool vis[N];//可见性LL dis[N];//距离LL h[N];//头节点//边相关,邻接表const int M=1e6+10;LL e[M];//表示顶点i连接e[i]LL ne[M];//表示顶点原创 2022-02-06 15:40:44 · 512 阅读 · 0 评论