2012年7月29日
摘要: Bellman-Fort(G, w, s) 第七行替换为DFS-Mark(v)DFS-Mark(v)以v为定点进行深度遍历,将所有的点都标记为负无穷正确性证明:根据定理24.4的证明,可以推导出Bellman-Ford结束之后在所有负权环中必然有一个点v不满足三角不等式 阅读全文
posted @ 2012-07-29 09:57 ellusak 阅读(748) 评论(1) 推荐(0)
  2012年7月28日
摘要: a) T为G的一个最小生成树,(u,v)为T中的任意一条边,可以证明(u,v)是G中所有u--->v的路径中的最小的边, 反正法:假设u--->v的某条路径P中存在一条边(x,y)的权重小于(u,v), T中存在u-->x, y-->v的路径,因此可以将(u,v)替换为(x,y),得到一个更小的树,显然和T为最小生成树矛盾 现在证明最小生成树也是瓶颈生成树 假设边(u,v)为最小生成树种的最大的边,权重为k;如果存在小于k的瓶颈生成树,则在该书中u--->v的路径上的所有的边权重小于k, 显然和上面的结论矛盾b) 遍历边,去掉所有大于b边,如果还是连通的则说明瓶颈 阅读全文
posted @ 2012-07-28 10:21 ellusak 阅读(328) 评论(0) 推荐(0)
摘要: 假设最小生成树T和T'按照权重排序后的边为(e0, e1, ..)和(e0', e1', ....), 引入记号Ei和Ei',分别为T和T'的第0到第i条边的集合假设ek和ek'为第一对不是同一条边的位置,假设ek为边(u, v), ek'为(u', v')证明第一部分:在T'中必然有一条u--->v的路径,记为P'(u,v): 1. P'(u,v)不可能只包含Ek-1'中的边:因为k为第一对不同的边故Ek-1 = Ek-1',如果u--->v只有Ek-1'的边则 阅读全文
posted @ 2012-07-28 09:40 ellusak 阅读(893) 评论(0) 推荐(0)
  2012年7月27日
摘要: 先说结论: 对于有环图,top排序不一定可以生成坏边最小的序列证明:1. 假设G至少需要去掉k条边才能变成无环图,则任意序列P的坏边数目bad[P] >= k; 证明: 如果存在P使得bad[P] < k, 则只要去掉P中的坏边则剩下的必然为无环图,这个和假设矛盾 推论:存在序列P使得bad[P]=k,去掉k条边,然后top排序即可2. 对有环图进行拓扑排序得到的序列P, bad[P]和反向边数目相等 证明:有反向边定义可证3. 需要证明反向边数和k的关系,通过反例可证明反向边树可能大于k DFS之后的树为A-->B->C, 然后存在C->B, C->A两条 阅读全文
posted @ 2012-07-27 12:01 ellusak 阅读(1078) 评论(1) 推荐(1)
摘要: 拓扑排序,然后考虑子图G'(V', E') V' = { s | s属于V, 且在拓扑中p<=s<=v } E' = { (u,v) | (u,v)属于E, u,v属于V' }可证明任何原图G中p到v的路径必然在G'中, 然后用动态规划求路径数即可, 总的时间为O(V+E) 阅读全文
posted @ 2012-07-27 11:40 ellusak 阅读(844) 评论(0) 推荐(0)
摘要: 1. 把无向图G转换为等价的有向图G', 原问题转换为求解有向图的欧拉路径问题,由于G’中的每个点入度等于出度,因此欧拉路径必然存在2. 按照1中求解欧拉路径的方法走迷宫即可 阅读全文
posted @ 2012-07-27 10:29 ellusak 阅读(664) 评论(0) 推荐(0)
摘要: 使用分治法解决, 假设树的根为root, 则树的直径对应的路径P有如下三种情况1. P在左子树中,2. P在右子树中,3. P经过了根root,此时P必然为Lmax --> root --> Rmax, Lmax为左子树中深度最大的节点; 等价于左子树高度+右子树高度+1Diameter(N) = max{ Diameter(Left), Diameter(Right), Height(Left)+Height(Right)+1 }T(n) = 2T(n/2) + f(n)f(n)为计算第三种情况的时间, 我们可以先通过后序遍历计算出以每个节点的的高度,需要O(n), 此时f(n) 阅读全文
posted @ 2012-07-27 10:14 ellusak 阅读(637) 评论(3) 推荐(0)
摘要: 从候选点中任意选择两个点u, v: 1. 如果存在u->v, 则u不可能为通用的汇 2. 如果不存在则v不可能是通用的汇每次选择都会去掉一个候选点,故需要选择V次, 可以使用链表来维护候选点,初始化需要O(V),每次选择前两个即可,每次选择以及删除候选点都可以在O(1)内完成;由于是邻接矩阵,可以在O(1)时间判断是否存在u->v; 总的时间为O(V) 阅读全文
posted @ 2012-07-27 09:58 ellusak 阅读(493) 评论(0) 推荐(1)
摘要: 使用一个额外的数组A[V], 初始化为-1, 时间为O(V); 注意只需要一次初始化就可以遍历v的邻接表,每项a有三种情况: 1. 如果a == v, 说明为环,删除该项 2. A[a] != v,说明为第一条v->a的边,A[a]=v 3. A[a] == v, 删除总时间为O(E+V)网上直接搜到的一个解答要求邻接表内部列表是增序的,这个解答没有这个限制 阅读全文
posted @ 2012-07-27 09:44 ellusak 阅读(322) 评论(0) 推荐(0)
  2012年7月26日
摘要: 1. Extract-Min: 最小节点在Bmax中,删除需要O(lgN) Decrease-Key: 将Bmax中的一个叶节点降低为比Bmax的根还小,冒泡需要O(lgN) Delete: 同Extract-Min即可 Union: 合并的H'有lgN个二项树,总是要O(lgN)2. Insert: 当n为偶数的时候,插入总是只要O(1),不存在为O(lgN)的情况 Minimum: 当n为2的整数次幂时,min操作只要O(1),不存在为O(lgN)的情况 阅读全文
posted @ 2012-07-26 11:21 ellusak 阅读(221) 评论(0) 推荐(0)