• 搜索与图论 - 朴素版Dijkstra算法

    Dijkstra算法是一种基于贪心的算法, 详情推导: 算法的基本思路: 首先初始化每个点的距离是正无穷, 起点为0 进行 n - 1 次循环 每次找距离的最小值 然后用距离的最小值去更新剩余点到起点的距离 如果终点的距离为正无穷说明没有最短路 Acwing 849. Dijkstra求最...
  • 搜索与图论 - 树的重心

    树是一种特殊的图,所以利用图的深度优先遍历就可以进行树的深度优先遍历。流程也和图的遍历类似。 AcWing 846. 树的重心 来源: https://www.acwing.com/problem/content/848/ 给定一颗树,树中包含n个结点(编号1~n)和n-1条无向边。 请你找到...
  • 搜索与图论 - Bellman - ford 算法

    bellman-ford 算法主要是用于对有边数限制的最短路问题。 基本思路: 首先循环k次代表K条边 然后枚举每条边, 更新每条边的最短距离 Acwing: 853. 有边数限制的最短路 来源: https://www.acwing.com/problem/content/855/ 给定...
  • 搜索与图论 - 八数码

    题目: 八数码 来源: https://www.acwing.com/problem/content/847/ 在一个3×3的网格中,1~8这8个数字和一个“x”恰好不重不漏地分布在这3×3的网格中。 例如: 1231 2 3x 4 67 5 8 在游戏过程中,可以把“x”与其上、下、左、右四...
  • 搜索与图论 - DFS与BFS

    深度优先搜索(DFS): 从某个节点往下开始搜索,走头,走到不能走的时候再回去(回溯)。 宽度优先搜索(BFS): 一层一层往下搜索,每次扩展一层。 数据结构 空间 DFS stack $O(h)$ BFS queue $O(2^h)$ BFS 有一个最短路的概念...
  • 数据结构 - 堆

    堆,又叫优先队列。堆是一颗完全二叉树结构(除了最后一层节点之外,上面所有节点都是为满的,最后一层,从左到右排列)。 手写堆的基本要求: 插入一个数 求集合中的最小值 删除最小值 删除任意一个元素 修改任意一个元素 小根堆: 根节点小于左右两边的节点。 大根堆: 根节点大于左右两边的节...
  • 数据结构 - 并查集

    并查集是一种以集合的合并和查询的一种结构。 并查集: 将两个集合合并 询问两个元素是否在一个集合当中 基本原理: 每个集合用一棵树来表示。树根的编号就是整个集合的编号。每个节点储存它的父节点,p[x]表示x的父节点。 问题1: 如何判断树根: if(p[x] == x) 问题2: 如何求x...
  • 数据结构 - Trie 树

    Trie 树又称为字典树,前缀树, 是一种用于高效存储和查找的字符串集合的数据结构。 结构如上图,头节点都为空,表示开始的节点。然后依次往下走,如果当前有以某一个字母为开头的继续往下走。如果没有创建出来,继续往下走。然后在以字母结尾的位置做出一个标记。记录有多少个字母是以它结尾的。 题目:...
  • 数据结构 - 单调队列

    和单调栈很相似,满足一定的单调性质,这些性质可以是单调递增,单调递减等等,使用的是队列结构。 具体操作就是: 确定某种单调性 按照这种单调性,从对头往队尾进行弹出数据 如果不满足这种单调性就一直弹出数据,直到满足性质或者弹空 压入数据 滑动窗口 题目来源: https://www.acw...
  • 数据结构 - 单调栈

    栈结构实现,但是存入的数据具有某种性质的单调性。这个单调性可以是递增也可以是递减。 具体操作就是: 确定某种单调性 按照这种单调性,从栈顶往栈底依次弹出数据 如果不满足这种单调性就一直弹出数据,直到满足性质或者弹空栈 压入数据 题目来源: https://www.acwing.com/p...