摘要:
预备 两个向量 和 的叉积写作 由 和 可得: 当 时, 在 的逆方向。 当 时, 在 的顺方向。 当 时, 和 共线。 分析 快速排斥 两条线段分别为对角线构造矩形。 若这两个矩形不相交,则这两条线段肯定不相交。 若这两个矩形相交,则需要跨立实验进一步判断。 代码 跨立实验 如果两条线段相交,那么 阅读全文
摘要:
定义 贝尔曼-福特算法,求解单源最短路径问题的一种算法,由理查德·贝尔曼(Richard Bellman) 和 莱斯特·福特 创立的。 它的原理是对图进行松弛操作,得到所有可能的最短路径。其优于迪科斯彻算法的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高。 原理 Bellman-Ford算 阅读全文
摘要:
定义 在连通图 G 中,如果删除顶点 u 及从 u 出发的所有边后所得的子图不连通,我们就称顶点 u 为图 G 的关节点或连接点。 原理 要解决这道题,我们可以检查图在单独删除各顶点之后的连通性,但这个算法要对每个顶点执行一次DFS, 效率不高。 不过,只要我们如下将DFS加以应用,就可以有效地找出 阅读全文
摘要:
定义 SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环。 原理 动态逼近法: ① 设立一个队列用来保存待优化的结点。 ② 优化时每次取出队首结点 u,并且用 u 点当前的最短路径估计值对 u 点所指向的结点 v 进行松弛操作,如果 阅读全文
摘要:
定义 弗洛伊德最短距离算法(Floyd Shortest Path Algorithm)又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法。 原理 我们的目标是寻找从点 i 到点 j 的最短路径。 从任意节点 i 到任意节点 j 的最短路径不外乎2种可能。 ①直接从 i 阅读全文
摘要:
定义 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。 原理 设图 G=(V,E) 所有顶点的集合为 V,起点为 S,最短路径树中包含的顶点集合为 S。在各计算步骤中,我们将选出最短路径树 阅读全文
摘要:
定义 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。 原理 设图 G = (V,E)所有顶点的集合为V,MST中顶点的集合为T。 ① 从G中选取任意顶点作为MST的根,将其添加至T。 ② 循环执行下述处理直至T=V 在连接T内顶点与V-T内顶点的边中选取权值最小的边 阅读全文
摘要:
定义 Kruskal算法是一种用来查找最小生成树的算法。 准备 树:如果一个无向连通图中不存在回路,则这种图称为树。 生成树 :无向连通图G的一个子图如果是一颗包含G的所有顶点的树,则该子图称为G的生成树。 生成树是连通图的极小连通子图。这里所谓极小是指:若在树中任意增加一条边,则将出现一条回路;若 阅读全文
摘要:
定义 在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。 该序列必须满足下面两个条件: ① 每个顶点出现且只出现一次。 ② 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在 阅读全文
摘要:
去重全排列 康托 定义 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。 康托展开 令X为全排列中的次序,num[]为原数组,n为全排列中数字的个数,为num[j] (j>i)小于num[i]的个数。 则 阅读全文
摘要:
前缀和 一维 令 $sum[n]=\sum_{i=0}^{n}a[i]$,则 $sum[r]-sum[l]=\sum_{i=l+1}^{r}a[i]$ int main() { int n,m,sum[maxn],a[maxn],l,r; sum[0]=0; scanf("%d%d",&n,&m); 阅读全文
摘要:
定义 线段树学习 权值线段树和线段树类似,只是维护的数据不一样而已。权值线段树的叶节点维护的是数据出现的次数。 为了防止数据过大,一般先离散化数据再使用权值线段树维护。 主席树的前置技能为权值线段树。 权值线段树可以解决: 实现 P3369 【模板】普通平衡树 #include<bits/stdc+ 阅读全文
摘要:
定义 设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。 如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数。 实现 归并排序 在归并排序中,利用cnt计数即可。 阅读全文
摘要:
定义 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 原理 快速排序算法通过多次比较和交换来实现排序,其排序流程如下: (1)首先设定一个分界值, 阅读全文
摘要:
定义 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 原理 第一 阅读全文