摘要: 并查集是解决两元素是否属于同一集合,将一个集合合并另一集合的数据结构。具体来说,我们使用数字代替集合,比如集合1,集合2.使用数组f[i]维护元素i属于的集合,比如f[2] = 4表示元素2属于集合4。具体我们有以下实现功能的代码 1 初始化表示集合的数组。 cin>>n>>m; for(int i 阅读全文
posted @ 2024-01-25 13:05 意外路过的番茄酱骑士 阅读(9) 评论(0) 推荐(0) 编辑
摘要: SPFA算法是在bellman-ford算法基础上优化而来,所以我们先讨论bellman-ford算法 bellman-ford算法的核心是‘松弛’。那么什么是松弛呢?以下图为例: 假设数组d[i]表示源点s到达结点i的最短路径长度,那么松弛指的就是当d[a] + w < d[b],也就是说,这时候 阅读全文
posted @ 2024-01-13 17:21 意外路过的番茄酱骑士 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 本文是https://www.acwing.com/problem/content/description/837/的总结,有兴趣可以做做 字典树的实现依赖于树结构,有两种操作,1是插入字符串,2是查找字符串。使用idx维护最新的结点下标。如下图,假设我们维护一个 可以看到,我们维护了一个树形结构储 阅读全文
posted @ 2024-01-10 14:06 意外路过的番茄酱骑士 阅读(21) 评论(0) 推荐(0) 编辑
摘要: 首先,本文默认读者基本熟悉Dijkstra基本原理 DIjkstra是单源最短路的一种算法。使用数组d[i]来储存结点i到源点s的最短路径长度,每次更新d[i]数组后,d[i]中最小的一定是一条最短路径长度。也就是说每次更新后都能找到一条最短路径,以下给出证明: 假设d[]数组中当前最小值对应的结点 阅读全文
posted @ 2024-01-07 16:46 意外路过的番茄酱骑士 阅读(20) 评论(0) 推荐(0) 编辑
摘要: 假设现在有数组a[n],和滑动的窗口长度为k <= n,要求长度为k的滑动窗口的最值,一般来说,我们会遇到以下问题: 在窗口向右滑动时,由于不知道将要删除的元素在窗口中的位置,于是只能暴力遍历窗口来删除旧元素。增加了时间复杂度到O(n^2logn) 以下是解决该问题的一种方案: 使用一个额外的优先队 阅读全文
posted @ 2023-12-15 16:35 意外路过的番茄酱骑士 阅读(17) 评论(0) 推荐(0) 编辑
摘要: 一,解决问题 kmp算法解决的是字符串匹配的问题,具体来说假定我们要在主串s[ ] 中匹配模式串p[ ],找到匹配到的位置loc; 二,具体实现和演变过程 最自然的想法是暴力写法 (BF)枚举主串字符s[ i ] ,和模式串p[ j ]。一个一个匹配,如果匹配失败,i指针回退回起点,往前进一位,再次 阅读全文
posted @ 2023-12-15 16:07 意外路过的番茄酱骑士 阅读(17) 评论(0) 推荐(0) 编辑