
算法学习
ORZZROORZZRO
川大的小可爱
展开
-
算法杂题(思维、模拟)
题目链接A - やめて嘘はあなたらしくないよThe hhh-index of an author is the largest hhh where he has at least hhh papers with citations not less than hhh.Bobo has published many papers.Given a0,a1,a2,…,ana_0, a_1, a...原创 2019-12-15 06:55:39 · 520 阅读 · 0 评论 -
堆、堆组合(对顶堆)以及堆的灵活应用
堆的简介转载链接(堆的基本概念)对顶堆对顶堆是由一个大顶堆和一个小顶堆组合而成的数据结构,与传统堆维护最大数不同,对顶堆用与动态维护第K大的数。...原创 2019-12-09 20:52:28 · 1195 阅读 · 0 评论 -
关于可达矩阵的O(N*N)算法和强分图的O(E)算法
#include<iostream>#include<vector>#include<stack>#include<algorithm>#include<set> using namespace std;//矩阵基类class Matrix {protected: int**Data; int ColLength,...原创 2019-12-04 14:40:22 · 1788 阅读 · 0 评论 -
学习笔记——求最大回文子串
作者:@houkai转载->http://www.cnblogs.com/houkai/p/3371807.html他讲的太好了。。。。转载 2019-04-29 15:55:04 · 178 阅读 · 0 评论 -
学习笔记——Tire树
简介字典树,即Trie树,是一种常用的数据结构。比如一个单词“apple”,可以分为五个字母,一般以一个虚节点为起始节点,记为rootrootroot,那么apple这个单词就可以表示为rootrootroot->a->p->p->l->e,同理,badbadbad就是rootrootroot->b->a->d。字典树的优点在于其不仅增加单词的复杂...原创 2019-04-28 22:40:46 · 338 阅读 · 0 评论 -
学习笔记——KMP字符串匹配算法
简介KMP算法是一种字符串匹配算法,它利用了模式串(被匹配串)自身的相关信息来减少匹配次数。本文假设文本串(待匹配串)为T,模式串(被匹配串)为P。而T,P的长度分别为TLen,PLen。记Ti为T的前i个字符构成的子串,T-i为T后i个字符构成的子串,P同理。求辅助数组在实现这个算法前,我们需要先求一个特殊的数组,暂且记为Pre[PLen+1]。这个数组的含义为Pre[i]=max(j),...原创 2019-05-04 01:13:42 · 604 阅读 · 0 评论 -
学习笔记——并查集(上)模板和种类并查集
简介并查集是用于处理点集之间关系的一种方法,支持合并和查询两种操作,即将两个集合合并和查询两个点是否位于同一集合内,是一种树形数据结构,一般采用数组实现。首先定义一个数组ppp,对于点iii,p[i]p[i]p[i]存储着i的父节点的下标,通过递归查找找到其根节点。而合并点i,j时,首先找到i,j的父节点pi,pj,然后让p[pi]=pj或p[pj]=pi即可,也就是让i,j所在的集合的根节点...原创 2019-02-20 02:51:25 · 1014 阅读 · 0 评论 -
学习笔记——最小生成树
简介规定点的数量为V,边为E生成树是指在连通图中包含所有节点的一棵树,即该树包含所有节点的同时每个节点的入度出度均为1。而一幅图的生成树有很多种,其中最小生成树指的是带权图的生成树中边权和最小的树。并且若图中的边权都不相同,则最小生成树唯一(每两个节点都只有一条边相连,每次选最小的),反之,就不一定了。最小生成树一般有两个通用的算法,一个是Prim算法,一个是Kruskal算法。Prime...原创 2019-02-19 00:51:50 · 1053 阅读 · 0 评论 -
学习笔记——多源最短路(Floyd算法)
简介Floyd算法是一种区间动态规划,通过不断更新状态的方式来寻求最优解。假如我们有一个图,我们想从其中的A点走到B点,那么最短路一定就是A到B吗,显然不是。可能是A->C->B,也可能是A->D->F->B更短,那么我们怎么求呢?我们可以对每个点都跑一边Dijkstra。不过这样的话时间复杂度就是O(V(V+E)log2V)O(V(V+E)log_{2}V)O(V...原创 2019-02-24 01:03:35 · 749 阅读 · 0 评论 -
学习笔记——单源最短路之Dijkstra
简介单源最短路问题指的是给定一个带边权的图,求其中一个点到所有其他点的最短路是多少。常见的算法有Dijkstra算法,Spfa算法等,这里介绍的是Dijkstra算法。想一想Prim算法求最小生成树,求得的最小生成树其实就是各个点间的最短路径,所以求单源最短路是只要从目标点出发,在最小生成树生长的同时记录下个点到目标点的距离即可。所以其时间复杂度和Prim算法一样,不用堆优化为O(n2)O(n^...原创 2019-02-23 23:22:05 · 440 阅读 · 0 评论 -
学习笔记——拓扑排序
简介拓扑排序是将一张有向图的节点进行排序,使得形成的拓扑序满足一个节点的前驱必然在其前面,一个节点的后继必然在其后面。拓扑排序是根据各个节点的入度来实现的(即该节点前驱的个数)。首先先将入度为0的节点扔进队列里(即没有前驱的节点),每次弹出一个节点,即已经将他排好序,把它从图中拿出来。因为该节点已经从图中拿出来了,因此要遍历该节点的所有后继,将它的所有后继入度减一。此时如果他的某一个后继入度减...原创 2019-02-18 12:55:00 · 820 阅读 · 0 评论 -
学习笔记——双向BFS
简介双向BFS就是在一直当前状态和期望状态时,从当前和期望两个状态同时出发,直到某个状态同时被访问到两次,那么当前状态->被访问两次的状态->目标状态就是当前状态到目标状态的解。那具体会有多块呢?加入每一次搜索都有n个新的状态(比如迷宫问题就是上下左右四个状态),从起点到目标路径长为m,那就要搜索n+n2+n3+......+nmn+n^{2}+n^{3}+......+n^{m}n...原创 2019-02-21 22:09:49 · 2609 阅读 · 2 评论 -
学习笔记——并查集(下)带权并查集
简介带权并查集是一种带有某种信息的并查集,即每个子节点都储存其自身与跟节点的关系,如路径长度等。定义一个带权并查集数组:struct{ int p;//父节点编号 int data;//与根节点的关系}f[MAX];这里关键的问题时带权并查集在合并和路径压缩时怎么做到状态更新呢?合并首先合并,除了普通的合并,只要加一条信息更新就行了(更新最终根节点)void merge(int ...原创 2019-02-21 21:36:30 · 883 阅读 · 0 评论