
算法
菜就多练,不要多想
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
树状数组
树状数组原创 2019-10-26 20:02:49 · 89 阅读 · 0 评论 -
差分约束入门+理解(太菜了)
差分约束经典的形式就是给出一组不等式,让你求出满足这组不等式的解(所有的解值最大或最小)。例如:这组不等式要求x2、x1的差值范围那么就是把1、2式相加即得x2-x1<=5 (1)x2-x1<=1 (2)很明显,取x2-x1<=1,就是右边取最小值,因为x2、x1要同时满足上面两个不等式,所以x2、x1差的范围小于等于1。由以上我们可以得到什么启发呢?我们知道,最短路算法是通过(如下图)这样松弛边的这个和不等式有什么关系呢?(看下面这个图)x3-x1<=原创 2020-09-11 19:14:12 · 221 阅读 · 0 评论 -
点分治入门+理解
推荐博文:点分治入门理解:首先要找出树中的重心。那么是什么树的重心呢?树的重心即依次以每个节点为根,求出他们的最大子树的节点数,根节点中最大子树节点数最小的就是树的重心。比如以这颗树为例中:在以1节点为根节点时,它的子树分别为两个蓝色圈所包围的部分,左边部分的节点数为3,,右边部分的节点数为2,所以他的最大子树节点数为3。在以2为根节点,求他的最大子树,如图,最大子树的节点数为3。这样依次求3、4、5、6的最大子树节点数。3的最大子树节点数为4;4的最大子树节点数为4;5的最大原创 2020-09-06 15:24:07 · 188 阅读 · 0 评论 -
树的直径
**树的直径:**一棵树中相距最远的两个点所在的路径即为树的直径。性质:树中任意一个点到直径的其中一个端点距离最远。求直径端点:两遍DFS先以树中任意一个点出发,找出离该点距离最远的端点A,该端点A即为直径的其中一个端点,再以端点A出发,寻找离端点A距离最远的端点B,此时端点B即为直径的另外一个端点。题目:https://ac.nowcoder.com/acm/contest/6874/A#include<bits/stdc++.h>using namespace std;#def原创 2020-08-31 16:22:13 · 129 阅读 · 0 评论 -
欧拉回路,欧拉通路(dfs+并查集)
欧拉回路定义:如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径。如果一个回路是欧拉路径,则称为欧拉回路。要判断无向图G时欧拉回路的充要条件:G是无奇度结点的连通图。(欧拉通路则仅存在两个奇度顶点,并且以此两个顶点为端点)。所以把握两个条件,一个是无奇度顶点,一个是连通。前置知识:无向图顶点度的个数即为与顶点相关联的边的个数。判断连通可以用两种思路,一个是并查集,一个是dfs;并查集实现:#include<bits/stdc++.h>using namespace s原创 2020-07-06 16:05:58 · 623 阅读 · 0 评论 -
图的最小生成树(kruskal)
最小生成树定义(白话):给你一个地图,这个地图上有n个城市两两互通,让你选择至少n-1条边可以使n个城市互通,并且使边的总长度之后最短。第一种思路:每次选择最短的一条边进行连通,直到选择了n-1条边为止(因为n个点要互通,只需n-1条边即可)。所以首先要对边从小到大进行排序,每次选择边时,把边的两个顶点加入已连通的集合中,当然,如果这两个顶点都加入了已连通的集合中,就忽略这条边。所以要用并查集去判断两个顶点是否在同一个已连通的集合中。如果是,则舍弃这条边,反之,则把两个顶点中未加入到连通集合的顶点加入原创 2020-07-06 15:34:18 · 316 阅读 · 0 评论 -
拓扑排序
拓扑排序定义:对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。**前置知识:**对于边u->v, u称为v的前驱,v称为u的后继。拓扑排序实现步骤:1.在有向图中选一个没有前驱的顶点并且输出2.从图中删除该顶点和所有以它为尾的弧即删除所有和它有关的边3.重复上述两步,直至所有顶点输出,或者当前图中不存在无前驱的顶点为止,如果是后者则代表这个有向图是有环的,因此,也可以通过拓扑排原创 2020-07-06 15:01:54 · 309 阅读 · 0 评论 -
单源(多源)最短路算法Dijkstra、Bellman-Ford、SPFA
最短路算法单源最短路:即一个点到任意点的最短路径多源最短路:即任意一点到任意一点的最短路径Dijkstra算法:这个算法是通过点去更新最短路,每次找离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终找到源点到其余点的最短路径。用一个dis数组来存源点到其余各点的最短路径,起初,dis【s】源点设为0,其余设为极大值,初始化源点到其他能达到的顶点的距离,每次从dis数组里面选择一个从未更新过的顶点进行扩展,依次循环n-1次,则能得到源点到其余各点的最短路径。代码如下:#include<原创 2020-07-06 14:16:58 · 1383 阅读 · 0 评论 -
图的割点vs图的割边(Tarjan算法)
图的割点vs图的割边(Tarjan算法)割点含义:如果一个无向图中,删除某个顶点之后可以使任意两点之间不能相互到达,这个顶点即为割点。割边含义:在一个无向连通图中,如果删除一条边使得任意两点无法互通,这条边就是割边。前置知识:dfs序,即以dfs遍历图,每个点依次被访问到的次序。下面将会以dfs【】数组记录。最早访问顺序:即一个图中,不通过父亲节点能够最早访问到的次序。即在不经过父亲节点,回朔时访问到的顶点的最早时间戳。下面以low【】数组记录。求割点:#include<bits/stdc原创 2020-07-06 12:21:24 · 256 阅读 · 0 评论 -
Tarjan算法
前置知识:如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。Tarjan算法:求一个图中有几个强连通分量。Tarjan基于深度优先搜索,首先要求图中每个节点的dfs序,即时间戳,就是每个点被访问的次序dfs【N】,用low【N】数组记录每个连通分量的根结点,根节点规定以子树中最小的时间戳为根节点。Tarjan算法原创 2020-05-22 18:59:29 · 119 阅读 · 0 评论 -
背包问题
特点:给定几种物品,每种物品有且只有一个,并且有价值和体积两个属性。考虑:对每个物品只需要考虑放与不放两种情况。1.不放,不需要处理。2.放,由于不清楚之前放入的物品占据了多大的空间,所以需要枚举,将这个物品放入背包后可能占据背包空间的所以情况。背包容量v,第i件物品的体积是c[i],价值是w[i];状态转移方程:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]...原创 2020-03-20 22:37:56 · 148 阅读 · 0 评论