![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM
zhouzejun1
这个作者很懒,什么都没留下…
展开
-
小学期学的算法和做OJ题的各种经验总结
1.数组的引用。用模板时传递的数组必须用常数初始化 template<int N> void f(int (&a)[N]){ ... } int main(){ int m = 2; int a[m] = {..}; f(a) //× int a[2] = {..}; f(a) //√ } 2.使用scanf和cin读取字符串的时候遇到空格会当作两部分分别读取,...原创 2019-07-09 02:05:10 · 354 阅读 · 0 评论 -
带权图最短路径问题
单源最短路问题 Bellman-Ford算法:O(|V|×|E|)(浪费时间,遍历每一条边的时候不知道当前边的de.from是不是正确的最短距离; 而且对于每个点都要遍历一次该点的相连边) 从起点到第i个点的最短距离di = min{dj + wij | j与i相邻} (所有(到点i相邻的点(j)的最小距离 + 这两个点的距离)中的最小值)实现方法:存边的to, distance,初始化最短...原创 2019-07-06 15:53:41 · 3233 阅读 · 0 评论 -
差分约束
差分约束系统的解法利用到了单源最短路径问题中的三角形不等式。即对于任何一条边u -> v,都有: dv ≤ du + wu->v 其中du和dv是从源点分别到点u和点v的最短路径的权值,wu->v是边u -> v的权值。 这个不等式可以化成 dv - du ≤ wu->v 比如给出三个不等式 {b−a≤k1c−b≤k2c−a≤k3 \left\{ \b...原创 2019-07-06 15:51:04 · 121 阅读 · 0 评论 -
并查集并查集 disjoint set要点
查询a,b是否在同一组 合并a,b所在的组 rank可以不比较 void init() int find() void unite() bool same() 可以用来判断图内是否有环(初始化:遍历相连的两个点加入到并查集中)。如果两个点已经在集合里说明他俩已经有一条路了,这时候如果当前边把这两个点相连那么他俩肯定能构成环) //不带rank const int MAXV = 10; int ...原创 2019-07-06 13:55:46 · 201 阅读 · 0 评论 -
字典map要点
pair pair<type, type> p; pair<type, type> p2(val,val); p.first; p.second; map<char, int> m; //插入 //1. m['b'] = 2; //2. m.insert(make_pair('a',1)); //查找 //1. puts(m['a']); //2. ma...原创 2019-07-06 13:53:01 · 180 阅读 · 0 评论 -
集合set要点
集合set是用二叉搜索树维护的容器 //搜索 set<type>::iterator it; it = set.find(val); if(it != set.end()) puts("found"); //删除 set.erase(val);` //遍历 for(it = set.begin(); it != set.end(); it++) puts(*it); ...原创 2019-07-06 13:51:56 · 129 阅读 · 0 评论 -
BFS、DFS要点
1.bfs 最先出的结果就是最短路径 用queue或priority_queue(<queue>) 不要坐标参数,从queue中取 priority_queue每次取出的是最大的(优先级最高的),要重写(默认是)小于比较 取元素pq:top(); q:pop() 2.dfs 需要当前点的坐标参数 ...原创 2019-07-06 13:41:01 · 218 阅读 · 0 评论 -
DP-划分数
有 n 个无区别的物品 , 将他们分成 不超过 m 堆, 问有多少种分法 ? dijd_{ij}dij表示将数字i 分成j 份的方案数(初始化d00=1d_{00}=1d00=1,其他为0),有2种类型: 带0的划分可以少一份。如4 = 0 + 2 + 2 = 2 + 2,把4分成3份 = 把4分成2份 即把i分成j份 = 把i分成j-1份。所以dijd_{ij}dij 包含 di,...原创 2019-07-10 18:08:44 · 139 阅读 · 0 评论 -
DP-最长公共子序列LCS、最长上升子序列LIS
小学期学的算法和做OJ题的各种经验总结 小学期学的算法和做OJ题的各种经验总结最长公共子序列 LCS:最长上升子序列 LISDP: O(n^2^)代码贪心+二分O(nlogn)代码: 最长公共子序列 LCS: 正着遍历,倒着构造 c[i,j]表示:(x1,x2....xi) 和 (y1,y2...yj) 的最长公共子序列的长度 序列回溯,可以用栈。 //dp初始化为0 for(i=1;i&l...原创 2019-07-10 16:44:35 · 160 阅读 · 0 评论 -
DP中的背包问题
小学期学的算法和做OJ题的各种经验总结 小学期学的算法和做OJ题的各种经验总结01背包问题优化另外代码完全背包问题区别0-1背包和完全背包多重背包 01背包问题 不同的物品每种有一件 理论上来说就是记录搜索结果的搜索 https://www.cnblogs.com/zyacmer/p/9961710.html 讲的很好,取一些精华下来: 用dij表示前i个物品剩余空间为j时的最大总...原创 2019-07-10 03:34:09 · 195 阅读 · 0 评论 -
二叉搜索树
小学期学的算法和做OJ题的各种经验总结 文章目录小学期学的算法和做OJ题的各种经验总结二叉搜索树:(二分查找)特征:使用:遍历方式:实现: 二叉搜索树:(二分查找) 特征: 保证每个节点的左子树所有点都比自己小,右子树所有点都比自己大。 使用: 查找某个数是否在集合中:从根出发,比当前结点小就找左儿子,否则找右儿子。 插入:查找应该放的位置,直到这个位置是空的,放入。 删除: 谁来填这个点的位置...原创 2019-07-09 17:04:26 · 90 阅读 · 0 评论 -
小顶堆、小根堆 Small Heap
小顶堆。可以用vector实现。 求最大的前k个数就可以构造一个k个元素的小顶堆,堆顶是k个大数中最小的,新元素比堆顶大就替换堆顶、排序,否则不管 特征: 父亲的值 < 儿子的值,元素从上到下从左到右紧凑排列(完全二叉树) 过程: heapify:对当前节点不断向下交换直到没有大小颠倒,交换的时候优先选数值小的儿子换 入堆:插在堆的末尾(数组的最后一个),然后不断【向上提升直到没有大小颠倒...原创 2019-07-08 18:37:51 · 1636 阅读 · 0 评论 -
最小生成树
Prim算法(点遍历,距离小的点优先) Kruskal算法(边先排序再遍历,不能构成环(并查集)的边优先) 初始化(只用调用init) 判断:遍历所有的边,如果该边连接的两个点不在集合中就加入集合并取该边 #include <iostream> #include <stdio.h> #include <algorithm> #include <cs...原创 2019-07-06 15:54:38 · 156 阅读 · 0 评论