随笔分类 - 算法
摘要:邻接矩阵 设一个图中有个点,那么这个图的邻接矩阵就是一个的矩阵。 所以用一个二维数组来储存这个邻接矩阵。 举个例子:若已知无向图中,到的路径权值是,那可以给赋值为,由于这是一个无向图,所以还需要反向连一次边,就是把$
阅读全文
摘要:线性筛约数个数 #include <iostream> #include <cstdio> using namespace std; const int N = 10000000; int n, prime[N + 1], dnum[N + 1]; void init (int n) { dnum[
阅读全文
摘要:Kruskal算法 给定一张无向图,若用这张图的全部节点构成一棵树,且这棵树所有边的权值之和最小,则称这棵树为最小生成树。 所以很显然我们只需找出条边,让这些边使这张图不构成环的前提下,边权尽可能小,这就是Kruskal算法。 算法流程:我们把边权按照从小到大排序,然后按顺序把他们接到
阅读全文
摘要:深度优先搜索(DFS) 深度优先搜索的思想是从一个节点出发,不停地向深处访问它的子节点,直到它的子节点除了它的父亲外没有别的节点与之相连,那么这时就回溯,退到它的父亲节点,继续上一步的操作。 所以,深度优先搜索是一个递归的过程。 理解了深度优先搜索的思想,现在来看看它的代码是如何实现的: void
阅读全文
摘要:什么是负环? 负环的定义是在一个环中,其环上的权值和小于。 怎么判断负环? 根据负环的定义,我们知道在有负环的图中不存在最短路,因为你可以绕着负环一直跑,而你的路径和却会越来越少! 所以如果我们在有负环的图上跑SPFA,会陷入死循环的! 正因为这点,所以可以用SPFA来判断负环。 用$cnt[
阅读全文
摘要:什么是树的直径? 一棵有权值的树上,两点之间的距离为这两点之间的路径权值和,而树的直径就是最远的两个节点的距离,即最大的权值和。 如同上图所示,这棵树的直径就是节点与节点的距离,长度为。 怎么求树的直径? 树的直径通常有两种解法:树形DP,两遍搜索。 树形DP: 树的直径一定是某
阅读全文
摘要:什么是差分约束系统? 差分约束系统是一种特殊的元一次不等式组,它包含个变量以及个约束条件,每个约束条件都是由两个变量作差得到的,形如,其中是常数。 我们根据题目要求,并用这个约束条件求出某个不等式的最值,例如的
阅读全文
摘要:Tarjan求强联通分量 什么是强联通分量? 强联通分量即在图中找出一个最大的图,使得这个图上的任意点可以互相到达,一个点也可以算是一个强联通分量。 如上图,构成了强联通分量,因为它们在一个环上,可以互相到达,同时和也分别是强联通分量。 怎么求强联通分量?
阅读全文
摘要:什么是LCA LCA即是树上两个节点的最近公共祖先。 这个应该都知道是什么意思吧= = Tarjan求LCA 这个一个离线算法(离线算法就是把所有询问先读入并储存,最后再把答案一起输出),它的算法流程如下: 当访问到某个节点,且还未回溯到这个节点时,把这个节点标记为。 如果已经访问并回溯到了某
阅读全文
摘要:什么是树形DP? 顾名思义,就是在树上DP。 怎么树形DP? 通常情况下,就是就是从根节点开始,并进行。 状态转移一般是从子节点向上转移,具体怎么转移看题目。 所以总的来说就是把平常的动态规划在树上转移而已。 我知道我上面讲的就是废话qwq 一道模板题 很经典的树形DP 题解: 首
阅读全文
摘要:众所周知,一棵树如果有个节点,那么这棵树有条边,而基环树就是有个节点,条边,相当于在一棵树上多连一条边形成一个环。 所以对于基环树,我们在树上可以用的算法是不能直接套进基环树里面用的。 那么如何解决呢? 把这个基环树删掉一条边变成树就行了! 基本上所有题目都是这样子的
阅读全文
摘要:欧拉路 给定一张无向图,若存在一条从节点到节点的路径,恰好经过每条边一次(节点可以重复经过),那么称这条路径为到的欧拉路。 欧拉回路 如果存在一条欧拉路从出发并且回到,那么称这条路径为欧拉回路。存在欧拉回路的无向图被称为欧拉图。 欧拉路的存在性判定 无向图 每个节
阅读全文