
图论与数据结构
文章平均质量分 75
图论、数据结构学习笔记
Avalon Demerzel
ICPC区域赛银牌+退役ACMer
展开
-
【数据结构】自动机全家桶(AC、回文、后缀自动机)
AC自动机、回文自动机、后缀自动机原创 2022-09-13 10:40:36 · 1565 阅读 · 1 评论 -
【图论】图文详解Tarjan算法有向图缩点
tarjan缩点图文详解原创 2022-08-11 12:11:15 · 1982 阅读 · 0 评论 -
【数据结构】树链剖分 (图文代码详解)
树链剖分算法图文详解原创 2022-08-09 16:15:25 · 1959 阅读 · 0 评论 -
Demerzel的ACM代码模板(持续更新)
ACM代码模板原创 2022-07-14 16:01:37 · 632 阅读 · 0 评论 -
【图论】差分约束算法详解
详解差分约束算法解题过程中的注意事项原创 2022-07-05 11:49:14 · 2838 阅读 · 1 评论 -
【数据结构】线段树区间查询修改板子
//#pragma GCC optimize(2)#include <bits/stdc++.h>#define endl '\n'#define int long long#define INF 0x3f3f3f3f#define ull unsigned long long#define mem(a, b) memset(a, b, sizeof(a))#define ck(x) cerr << #x << "=" << x <<原创 2022-03-12 14:19:19 · 1379 阅读 · 0 评论 -
【数据结构】线性处理字符串中指定字串的个数问题
一、问题引入给出一个长度为n的字符串S和一个长度为m的不含重复字符的字符串T,每次你可以在S中删除一个等于T的子序列,最多可以删除多少次?如字符串S=ababccd,T=abc,可以选择s1s2s5,s1s2s6,s1s4s5,s1s4s6,s3s4s5,s3s4s6进行删除,删除后分别得到abcd,abcd,bacd,bacd,abcd,abcd。如果删除后得到abcd,则还可以再进行一次删除,最多可以删除2次。这里注意,字符串T种只会包含小写字母以及T中不会出现重复的字符二、问题分析提炼一下原创 2022-02-15 09:59:07 · 814 阅读 · 0 评论 -
【图论】关于Dijkstra与Spfa算法区别的思考和分析
Dijkstra与Spfa算法区别的思考和分析一、前言二、算法原理区别分析1.Dijkstra分析2.Spfa分析三、例题讲解分析1.例题链接:[Acwing 香甜的黄油](https://www.acwing.com/problem/content/1129/)2.题目分析3.正确代码一、前言在最短路问题中,Dijkstra算法与Spfa算法都是比较常用的算法。但是如果学习了这两个算法我们就能发现Dijkstra算法的优先队列优化与Spfa算法的代码极为相似,如果不去深入了解两个算法的原理与区别的话在原创 2021-09-20 15:59:31 · 2114 阅读 · 1 评论 -
【数据结构】可以逃课其它字符串算法的字符串哈希算法
一、例题引入Acwing 字符串哈希给定一个长度为 n 的字符串,再给定 m 个询问,每个询问包含四个整数 l1,r1,l2,r2,请你判断 [l1,r1] 和 [l2,r2] 这两个区间所包含的字符串子串是否完全相同。字符串中只包含大小写英文字母和数字。输入格式第一行包含整数 n 和 m,表示字符串长度和询问次数。第二行包含一个长度为 n 的字符串,字符串中只包含大小写英文字母和数字。接下来 m 行,每行包含四个整数 l1,r1,l2,r2,表示一次询问所涉及的两个区间。注意,字原创 2021-09-17 14:19:01 · 222 阅读 · 0 评论 -
【数据结构】堆的手动模拟实现
例题链接:Acwing 模拟堆维护一个集合,初始时集合为空,支持如下几种操作:I x,插入一个数 x;PM,输出当前集合中的最小值;DM,删除当前集合中的最小值(数据保证此时的最小值唯一);D k,删除第 k 个插入的数;C k x,修改第 k 个插入的数,将其变为 x;现在要进行 N 次操作,对于所有第 2 个操作,输出当前集合的最小值。输入格式第一行包含整数 N。接下来 N 行,每行包含一个操作指令,操作指令为 I x,PM,DM,D k 或 C k x 中的一种。输出格式原创 2021-09-14 22:23:57 · 274 阅读 · 1 评论 -
【数据结构】图文例题详解单调栈与单调队列
单调栈与单调队列一、前言二、单调栈1、单调栈的概念与实现方式2、单调栈代码实现三、单调队列1、单调队列的概念与实现方式2、单调队列代码实现一、前言在学习了最基本的栈和队列的知识点后,我们可以通过栈和队列解决一些更加复杂的问题,也可以通过栈与队列来优化一些算法的时间复杂度。在本博客中,笔者将介绍一下单调栈与单调队列的概念与实现方法。二、单调栈1、单调栈的概念与实现方式与栈不同,单调栈中的元素必须保证某种单调性,可以是单调递增,也可以是单调递减。当然,为了保证栈中的元素单调,我们需要在入栈时进行一定的原创 2021-09-11 09:43:47 · 337 阅读 · 0 评论 -
【数据结构】C++STL map 常见用法小结
前言:map是C++STL中的一个关联容器,它提供一对一的哈希值。map中的每一个元素都由2个相同或者不同的数据类型组成第一个(first)数据类型可以称为关键字(key),每个关键字只能在map中出现一次第二个(secon)数据类型可以称为该关键字的值(value)1.map的定义 map<int, string>map1,map2;2.map的插入 map1.insert(pair<int, string>(100, "张三")); map1[101] = "李四原创 2021-07-06 14:51:55 · 232 阅读 · 0 评论 -
【数据结构】图文讲解神奇的单链表与双链表
单链表与双链表一、前言二、单链表概念讲解三、单链表代码讲解add_head()函数insert()函数del()函数四、双链表一、前言在平时我们的作业中,我们有可能会遇到对于数组需要进行一个数或者是一批数的插入处理。在这里我们如果采用传统暴力插入的话,每一次插入处理我们都是O(n)的时间复杂度,如果我们插入的次数一旦变多,那么很容易就会超时,在这里我们需要学习一种数据结构----链表。本篇博客建议与博主另一篇博客一起学习理解(【图论】链式前向星)二、单链表概念讲解在链表中,我们依然使用数组来模拟,原创 2021-09-06 22:44:53 · 756 阅读 · 1 评论 -
【数据结构】KMP算法分析与理解(图文分析)
KMP概念简单介绍KMP是一个字符串匹配算法,对暴力查找一一比对的方法进行了优化,使时间复杂度大大降低,被用来在主字符串中查找模式字符串的位置(比如在“hello,world”主串中查找“world”模式串的位置)。虽然在理解上有一定难度,但是如果掌握了其思路,我们会不由得感叹KMP算法的巧妙。问题引入与算法复杂度比较比如,我们给出两个字符串a=1231231232与b=312,查找b在a中出现了多少次,你首先想到的是什么方法呢?1.暴力枚举:通过暴力枚举a中所有的长度与b相同的字串然后每次都进行原创 2021-07-17 19:58:12 · 601 阅读 · 0 评论 -
【图论】图文详解匈牙利算法
匈牙利算法一、一些概念1.二分图2.二分图的匹配二、匈牙利算法的实现步骤1.情况一(你是我的唯一)2.情况二(你们都是我的翅膀)3.情况三(我会把你抢过来)4.情况四(我爱的人已经有了爱人)三、匈牙利算法的代码实现一、一些概念1.二分图一定不含有奇数环,可能包含长度为偶数的环, 不一定是连通图二分图是图论中的一种特殊模型。设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in原创 2021-08-18 13:39:37 · 3045 阅读 · 0 评论 -
【图论】染色法判定二分图详解
染色法判定二分图一、二分图二、染色法1.算法实现思路2.DFS深度优先遍历代码实现3.BFS广度优先遍历代码实现一、二分图一定不含有奇数环,可能包含长度为偶数的环, 不一定是连通图二分图是图论中的一种特殊模型。设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。原创 2021-08-15 17:10:46 · 2873 阅读 · 0 评论 -
【图论】Prim算法求最小生成树详解
Prim算法一、算法学习前先要知道1.最小生成树(必须了解)2.Dijkstra算法(建议了解)二、算法实现步骤1.初始化2.寻找三、算法的代码实现1.朴素Prim算法实现2.Prim算法优先队列优化一、算法学习前先要知道1.最小生成树(必须了解)对于无向图G(V,E),连接所有点V以及边集是E的子集的树称为G的生成树。而边的权值和最小的树即为G的最小生成树。2.Dijkstra算法(建议了解)Prim算法与Dijkstra算法在思路上非常相似,如果能理解Dijkstra算法的话对于Prim算法的原创 2021-08-13 14:20:57 · 2413 阅读 · 1 评论 -
【紫书第十一章】图论模型与算法入门
图论基础前言一、无根树转有根树二、表达式树三、最小生成树四、最短路问题1.Dijkstra算法2.Bellman_Ford算法3.Spfa算法4.Floyd算法前言有关图论的更多知识点请移步作者“图论与数据结构”专栏。专栏地址:图论与数据结构专栏一、无根树转有根树问题描述:输入一个n个结点的无根树的各条边,指定一个根节点要求转化为有根树。分析:树是一种特殊的图,我们可以用vector数组来存下这个图。然后定义一个数组p[n],p[i]为i的父节点。代码实现#include<iost原创 2021-08-12 17:42:04 · 612 阅读 · 0 评论 -
【图论】Kruskal算法求最小生成树详解
Kruskal算法求最小生成树一、算法学习前先要知道1.最小生成树概念2.数据结构:并查集二、Kruskal算法实现步骤1.把所有的边排序2.遍历所有的边三、Kruskal算法的代码实现一、算法学习前先要知道1.最小生成树概念对于无向图G(V,E),连接所有点V以及边集是E的子集的树称为G的生成树。而边的权值和最小的树即为G的最小生成树。2.数据结构:并查集博客链接:并查集介绍以及例题二、Kruskal算法实现步骤1.把所有的边排序把所有的边按照边的长度从小到大排序。对此,我们可以把边的起点原创 2021-08-12 15:31:47 · 2181 阅读 · 0 评论 -
【紫书第六章】二叉树、欧拉图基本概念与性质
一、二叉树的编号对于一个数组tree[N]而言,我们如果把tree[1]作为根节点,那么tree[i]的左儿子节点坐标为tree[i * 2],右儿子坐标为tree[i *2+1]。这是一个非常重要的知识点。例题博客:紫书p148例题6-6 小球下落(作者:maplegam)思路:本题很容易就能想到暴力的思路,但是暴力的时间复杂度并不能让我们解决这一个问题,因此我们需要换一个思路去解决这个问题。书上提到:使用题目给出的编号i,当i为奇数时,它是往左走的第(i+1)/2个小球 。通过这条性质,我们原创 2021-08-05 12:40:43 · 1068 阅读 · 0 评论 -
【图论】Floyd算法求任意两点间最短路
一、前言对于最短路问题,我们已经介绍了很多的算法来求解。其中每一种算法都有其不可替代性,分别适用于不同的情况。而在这篇博客里我们需要讲解的是求任意两点最短路的一个很简单的算法:Floyd算法。二、算法概念介绍Floyd算法其实是用到了动态规划的方法去解决图论问题,对于确定的起点与终点,我们可以通过状态的转移由之前求得的已知最短路来求得未知的最短路。如果要搞懂Floyd算法,你需要对于动态规划的知识点有所了解,否则可能会对其核心思想----状态转移无法理解。由于动态规划算法的特殊性,由代码来理解会更加轻原创 2021-07-28 18:35:59 · 1047 阅读 · 0 评论 -
【图论】Spfa算法求最短路(长得像Dijkstra的,Bellman_Ford的优化算法)
一、前言在之前的学习中,我们学过了Dijkstra算法和Bellman_Ford算法求最短路问题(Dijkstra求最短路)(Bellman_Ford求有限制的最短路),而今天我们要继续图论的学习。名义上,Spfa算法是Bellman_Ford的优化算法,但是…它的代码长得和Dijkstra算法真的好像啊,真的好像啊。二、概念介绍算法思路: 在Bellman_Ford算法中,我们需要依次遍历每一条边(a----->b,长为w)来更新我们的dis[b]。但是我们发现,如果dis[a]在循环中如果一原创 2021-07-28 15:43:15 · 219 阅读 · 0 评论 -
【数据结构】图文详解Treap平衡树
一、前言FHQ平衡树是一种树形数据结构,它是对二叉查找树的一种优化方式,但是学习的过程是真的非常的…痛苦。二、二叉查找树的概念首先,我们称具有以下3个性质的树为二叉查找树(BST)1.左子树上所有结点的值均小于或等于它的根结点的值。2.右子树上所有结点的值均大于或等于它的根结点的值。3.左、右子树也分别为二叉排序树。如图在这张图中我们可以发现,在二叉查找树中,从根结点开始查找一个点的时间复杂度为logn级别,在我们想对树进行插入查找的时候都非常方便。但是很遗憾,二叉查找树是有着它的缺陷的原创 2021-07-27 17:04:16 · 1859 阅读 · 0 评论 -
【图论】Bellman_Ford算法求有步数限制的最短路(图文详解)
一、前言在之前的学习中,我们学习了用Dijkstra算法求有向图的最短路问题Dijkstra算法求最短路博客。但是在Djkstra算法中,我们认为可以走的步骤是无限的,但是在日常问题中,我们需要解决有步数限制的最短路问题,这个时候,我们就需要学习一个新的算法来解决这个问题----Bellman_Ford算法。虽然看上去又是一个高大上的算法,但其实这个算法的实现也并不是什么太难的事情。而且,它还能处理边的长度为负数的情况。二、Bellman_Ford算法介绍由于是有步数限制和负数边存在,我们不能使用Dj原创 2021-07-27 10:15:47 · 2125 阅读 · 0 评论 -
【数据结构】树状数组效果讲解
说到树状数组,线段树就是一样逃不开的东西,在这里附上线段树的博客链接【令人头秃的线段树】线段树入门题目详解(代码逐句分析)线段树在处理动态求区间和的功能上可以说已经比较完美了,但是线段树的代码其实是比较繁琐的,稍有不慎就会翻车。尤其是在比赛时的高压环境,繁琐的代码其实是需要尽量去避免的。因此,树状数组的优势就体现出来了----代码在实现上相当方便。但是当然,凡事都是有代价的,树状数组的理解相当痛苦,基本上是属于知其然却不知其所以然的地步。由于笔者能力有限,所以也没有信心为大家把树状数组的原理讲述清楚,因原创 2021-05-16 14:49:04 · 119 阅读 · 0 评论 -
【数据结构】并查集入门例题讲解(c++代码逐句分析)
在平时写题的过程中,我们可能遇到这样一种题目----对于一个无向连通图,我们要询问2个点是否是连通的。在这个时候,我们就需要一个叫做并查集的数据结构来解决这种问题。有关并查集的基本概念,在优快云中有大佬的博客写的非常通俗易懂,大家如果在之前从来没有听说过并查集这个概念,那么建议在看完有关博客后再通过本博客的题目进行练习巩固。因为本篇博客并不打算对并查集的概念进行讲解(是作者太菜了 )题目情景引入 Acwing 合并集合一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。现在要进原创 2021-05-21 17:54:02 · 344 阅读 · 0 评论 -
【数据结构】字典树TrieTree图文详解
问题引入现在,我给你n个单词,然后进行q次询问,每一次询问一个单词b,问你b是否出现在n个单词中,你会如何去求呢?暴力搜索?但是我们如果这么做的话时间复杂度一下就高上去了。大家都是成熟的ACMer了,不要再惦记着暴力的方法啦,要优雅。你想想,问题的描述像不像查字典的操作?你平时是怎么查字典的?想想看?如果你要在字典中查找单词“Avalon”,你是不是先找到首字母为‘A’的部分,然后再找第二个单词为‘V’的部分······最后,你可能可以找到这个单词,当然,也有可能这本词典并没有这个单词。你想想看,原创 2021-07-18 18:24:57 · 44928 阅读 · 29 评论 -
【图论】用链式前向星(邻接表)存有向图(图文代码逐句分析)
c++链式前向星代码分析(代码逐句分析)链式前向星是一种比较好用的存有向图的方法,相比邻接矩阵与邻接表,链式前向星有着更大的优势。但是相比于前两种存图方式,链式前向星的代码难度是比较大的,笔者在学习时也花了不少时间。而看了很多博客虽然写的很好,但如果面对真正的纯小白(比如我),还是有点费劲的。上代码!!!!#include<iostream>using namespace std;struct Edge //每一个edge代表一条边,数组序号代表编号{ int next; /原创 2021-03-14 20:06:39 · 2528 阅读 · 3 评论 -
【图论】拓扑排序:一个名字高大上的实际很简单的算法(图文详解)
前言在看到“拓扑序列”这4个字的时候,笔者人是傻的。拓扑序列是啥?听着就感觉好厉害!然后,当我得知“拓扑”两个字其实是一个大家都知道的单词“Top”的音译时,我不禁在想:翻译成这样,估计是故意让大家觉得这个知识点很难的吧。事实证明的确是这样,拓扑排序的概念与实现都是非常简单的。别被看上去高大上的名字吓到了。拓扑序列概念介绍首先,我们给出一个如图的有向图然后我们给出一个序列a={1,2,3,4},我们随便在有向图中选择一条边,我们都能满足在序列a中,这条边起点的编号一定在终点的编号之前。那么,我们就原创 2021-07-26 15:02:13 · 5019 阅读 · 1 评论 -
【图论】Dijkstra算法解决有向图最短路问题
在图论的学习中,我们有时候会涉及到有关点与点之间的最短距离的问题,而今天我在这里介绍一下一个解决最短路问题的比较基础的解决最短路问题的算法----Dijkstra算法及其优化。acwing Dijkstra求最短路 I题目描述给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。输入格式第一行包含整数 n 和 m。接下来 m 行每行包含三个整数 x,y,z,表示存在一条从原创 2021-07-12 19:35:55 · 2212 阅读 · 1 评论 -
【图论】图的深度优先遍历与广度优先遍历(图文讲解)
一、前言看懂这篇博客你需要提前知道这些知识点1.C++链式前向星存图;2.dfs和bfs是什么以及基本概念;3.C++STL中的queue,队列数据结构的简单知识点;4.有关图的一些简单的概念;图论是一个很重要的知识块,在学习如何遍历图之前,我们首先当然得知道要怎样去建图。在下面的内容里,我们将使用链式前向星来建图,如果对建图有什么问题的话可以移步这篇博客来学习。链式前向星在了解建图的方法后,我们当然要开始考虑如何遍历图中的每一个点,在这里,我们将使用两种最基础的遍历方式-----深度优先搜原创 2021-07-24 15:14:46 · 12615 阅读 · 0 评论