04 2016 档案
摘要:Merge Merge_sort实现源码: 1 #include <iostream> 2 #include <cstdio> 3 #define inf 1e9 4 using namespace std; 5 6 void merge(int A[],int p,int q,int r) 7 {
阅读全文
摘要:贪婪算法 贪心算法自顶向下,常规递归-》尾递归-》迭代。每次看一个解。 贪心算法的选择: 1.一个全局最优解可以通过局部最优(贪心)来选择达到。 2.我们所做的选择总是当前看起来最佳的的选择,然后再解决选择之后出现的子问题,可能依赖已经作出的选择但是不会依赖还没有做出选择的子问题。 3.证明在每一步
阅读全文
摘要:讲得不错的 有参考过的 一点经验:如果是多次实时查询用rmq 如果是一次性全部输入则用tarjan 倍增法:求lca看一下。 poj,1330 最近公共祖先的tarjan离线算法,一次性批处理,然后再query 注意建边,注意访问,注意基于dfs,注意寻找根节点,并查集的运用; 1 #include
阅读全文
摘要:讲得不错: 11111 Poj,3253 //Huffman每次选最小的两个加和最小,最后结果最小。 1 #include <iostream> 2 #include <queue> 3 #include <vector> 4 #include <algorithm> 5 #include <cst
阅读全文
摘要:后缀数组 后缀数组2
阅读全文
摘要:讲得不错:hash hash uva,188 怎么把字符串提取出来,注意一下就可以了。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6
阅读全文
摘要:看到一个讲得很好的:二分图的最大匹配,完美匹配,匈牙利算法 还有一个特别详细的:matching uva,10080 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #includ
阅读全文
摘要:讲得挺好的:Spanning Tree 强联通图:边为 c=v*(v-1)/2 uva,544 kruskal求最大生成树,然后求数边里面最小的限制。用到了剪枝的方法,把字符串映射成整数,然后跑一遍就过了。 1 #include <iostream> 2 #include <cstdio> 3 #i
阅读全文
摘要:今天看到的一篇博文,超赞 心得:Topsort不仅用于job/work的排序,字典序的排序,还可以适用于任意具有偏序关系的问题, 只要可以把问题转换为有向无环图,然后知晓其偏序,之后就是表示边/入度,然后用拓扑排序的思想去计算。 注意拓扑排序的唯一性是在全序关系的条件下建立起来的 注意拓扑排序是针对
阅读全文
摘要:具体的讲解参考: 讲得浅显易懂。 uva,10608 1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 const int maxn=30005; 7 8 int id[maxn]; 9 int sz[max
阅读全文
摘要:单源最短路径 单终点最短路径问题 单对顶点最短路径问题 每队顶点的最短路径 最短路径有最优子结构 即使存在负权值的边只要没有从源点可达的负权值回路就存在最短路径。 1.Bellman-Ford可以检查并报告出这种回路的存在 负权回路:回路中权值相加为负值就为负权回路 正权回路:不存在最短路径 0权回
阅读全文
摘要:线段树 基础讲解: 基础讲解2 学了一天线段树,写一点小感想:两种建树方式:开一个结构体,开一个数组,当然后者效率高 1:区间更新+点合并(求层次):求逆序数,求顺序数,通过下标离散化映射,因为不需要考虑区间的长度,只需要考虑每个数之间的位置关系。注意与hash数组--映射的联合应用。 2.区间更新
阅读全文
摘要:树的一些知识点 Expression trees, B and B* trees, red-black trees, quad trees, PQ trees uva,536 为一棵n叉树,k为深度 考虑到所以猫的高度: Ih(1+n/(n+1)+n*n/(n+1)*(n+1)+.....+n^k/
阅读全文
摘要:uva,572 简单dfs题目。 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 6 using namespace std; 7 const int maxn=105; 8
阅读全文
摘要:表示: 邻接链表:稀疏图 邻接矩阵:稠密图,快判两个节点之间是否有边 bfs: 广度优先搜索树:既可用于有向和无向 所有与黑色节点相连接的节点都是以发现。 灰色不一定。颜色属性 最短路径 广度优先树 深度优先树:树边,前驱子图,深度优先树,深度优先森林 深度优先树不相交,树边 两个时间戳,一个纪录被
阅读全文
摘要:无意中想起图的强连通分量来,之前也一直想写所以今天决定来填这个坑。PS:由于本人比较懒,之前做过一个讲解的PPT,不过那是好遥远之前,年代已久早已失传,所以本文里的图来自网络。以后周末都用来填坑也挺好。 分割线 在有向图G中,如果两个顶点间至少存在一条路径,那么这两个顶点就是强连通(strongly
阅读全文
摘要:说到以Tarjan命名的算法,我们经常提到的有3个,其中就包括本文所介绍的求强连通分量的Tarjan算法。而提出此算法的普林斯顿大学的Robert E Tarjan教授也是1986年的图灵奖获得者(具体原因请看本博“历届图灵奖得主”一文)。 首先明确几个概念。 关于Tarjan算法的伪代码和流程演示
阅读全文
摘要:容器分为: 序列式:vector动态数组,deque双向队列,list双向串行。 关联式容器:set,multiset,map,multimap,hash table 容器配接器:stack,queue,priority_queue stl的数据结构:biset,string,valarray st
阅读全文
摘要:list uva,127 前面见过几次类似的模型了。似乎输入输出差不多形式。 考虑vector或list里面放stack。因为这道题目只涉及到随机访问,所以vector相对要快一点。 因为每次其左边的第一个或第三个与其与其匹配时,就把它放在左一或左三上。有木有压栈的感觉~~ 1 #include <
阅读全文
摘要:queue/prioity_queue uva,144 1-25个学生,每人每年领40美元。一个防盗的atm机按照1.2...k的方式依次吐出硬币。 例如:第一次吐出1coin,第二次吐出2 coins 直到限制k。然后循环从1开始吐。学生插卡取钱,当达到限额就离开队列。 注意:只有当output
阅读全文
摘要:Map Poj,1840 题意很好懂。采用分治法直接把复杂度割掉2/5。 用short数组可以防止爆内存,int数组就GG了。 学习:考虑到爆内存,换范围小一点的。考虑时间,可以用滚动/动态滚动数组.dp[i][j] i或j可以变化不一定一开就很大。 其实就是也可以是hash表数据差不多。网上看了一
阅读全文
摘要:在计算机科学中,折半搜索(英语:half-interval search),也称二分查找算法(binary search)、二分搜索法、二分搜索、二分探索,是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于
阅读全文
摘要:uva,146 全排列问题:permutation 具体详解:参考Devymex UVa Problem 146 - ID Codes Problem:Please find the problem here.Solution:This is simply the next permutation
阅读全文
摘要:排序算法: 冒泡排序: 冒泡排序算法的运作如下: 1 #include <iostream> 2 #include <cstdio> 3 #include <math.h> 4 5 int main() 6 { 7 int a[10]; 8 for(int i=0;i<10;i++) 9 a[i]=
阅读全文
摘要:译者:kary contact:karymay@163.net STL概述 STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组。 要点 STL算
阅读全文
摘要:一步一步循序渐进。 Coin Change 具体思想:给你 N元,然后你有几种零钱S={S1,S2...,Sm} (每种零钱数量不限). 问:凑成N有多少种组合方式 即N=x1 * S1+x2*S2+...+xk*Sk (xk>=0,k=1,2..m) 设有f(x)中组合方式 有两种解答(自底向上回
阅读全文