摘要:
二项堆: 1.二项堆是由一些二项树连接而成,每一棵二项树都遵循最小堆性质(即关键字的节点大于等于其父亲几点) 2.对任意的度数k,一个二项堆至多有一棵二项树的根度数为k (说明一个二项堆最多只有lgn+1棵二项树, 将n写成二进制,每一个值为1的位对应一棵二项树); 二项堆中的各二项树的根被组织成一个链表,称为根表,且各根的度数是严格递增的操作: 1.建堆操作:Make-Heap 时间复杂度: O(1) 2.返回最小元素: Minumum lgn 过程:扫描一遍根表即可找出最小值,每棵二项树的最小值都在根节点处; 3.合并两个二项堆: Union lgn 合并过程:先... 阅读全文
随笔分类 - 图论和树
红黑树学习笔记
2013-12-25 02:48 by 凝月流风, 272 阅读, 收藏,
摘要:
从上学期就一直打算写出红黑树,但是由于能力太水,插入操作始终无法看明白,最近学习数据结构重新将红黑树的插入操作看了一遍,结合《算法导论》,《data structures and programing design in C++》 和侯捷的《STL源码》,终于弄清楚插入操作中保持树结构的几种情况,虽然这三本书在分类上有些许的差别,但本质的方法还是一样的。我还是根据算法导论将其分为3种情况(STL是分为4种情况):首先必须明白的情况是:每次插入节点的都设为红条件,如果需要保持红黑树结构时,则必然是新增节点的父亲节点也是红色,而且祖父节点必须是黑色(因为未插入前是一棵符合要求的红黑树) 1.... 阅读全文
AVL树
2013-12-03 01:55 by 凝月流风, 285 阅读, 收藏,
摘要:
之前学习AVL树,便照着书上(《Data structure and program design in C++》)的插入代码敲了一遍加深印象(去掉书上的继承)。1.AVL树是一种平衡二叉树,通过保持每一个节点的两棵子树的高度差不能超过1来保持树的平衡性。2.平衡性的保持:当插入新节点时,就可能破坏树的平衡性,针对某一个平衡性被破坏的节点的平衡操作(假设子树已经平衡,递归操作)有4种情况: case1:插入后左子树更高且左子树的左子树比右子树高,此时进行右旋操作 case2:插入后左子树更高且左子树的右子树比左子树高,此时进行双旋转操作 ... 阅读全文
Poj2516 最小费用最大流
2013-08-08 23:14 by 凝月流风, 594 阅读, 收藏,
摘要:
题目讲的是要从M个货源地提供K中商品个N个店主,不同的店主对不同商品的需求量不同,不同货源地K中商品的存货量也不同,第k种商品从货源地v到店主u的单位商品运输费用也不同,要求出满足所有店主要求的最小运输费用,若无法满足则输出“-1”。 我的想法是对于每一种商品分开处理, 每一种商品的运输费用都达到最小即可得到总费用最小,一个大循环for(i= 0; i 2 #include 3 #include 4 using namespace std; 5 const int MAXN = 110; 6 const int INF = 0x7FFFFFFF; 7 int cap[MAXN][MAXN... 阅读全文
POJ1149最大流
2013-07-30 22:12 by 凝月流风, 237 阅读, 收藏,
摘要:
难度在于建图,剩下的就是求最大流问题了。 贴上我的实现代码 //题目的难度在于如何建图,将每一个客户当做点,另外添加一个源点s和汇点t,每个客户点建一条有向边指向汇点t,容量为该客户要购买的猪的数量; //若客户i是猪圈j的第一个访问者,则从源点s建一条边指向节点i,容量为猪圈的初始猪数,若客户i不 阅读全文
强连通分量2-Tarjan算法 POJ1236
2013-07-29 14:14 by 凝月流风, 235 阅读, 收藏,
摘要:
这两天学习了一下求强连通分量的另一个算法Tarjan算法,相比于之前的Kosaraju算法,Tarjan算法只需要进行一次深搜即可,两个算法的时间复杂度都是O(n+m); 算法基本思路是:从任一顶点开始进行深搜,强连通分量是一棵搜索子树,在搜索是将每一个未处理的点弹入栈中,然后在回溯时判断以该节点为根的搜索子树是否为一个强连通分量,若是,则将栈顶至该节点的元素弹出,这些元素即构成一个强连通分支,然后继续回溯,遇到强连通分量则弹出,最终便可获得有强连通分量。 算法的关键在于如何判断以u为根的搜索子树是否为一个强连通分量,算法用一个DFN[u]记录节点u在深搜时的次序,并用一个Low[u]记录u. 阅读全文
浙公网安备 33010602011771号