背包问题
摘要:一.01背包问题给定一个容量为W的背包。和n个物品各为wi重量和价值各为ci的物品i。(1<=i<=n)问放哪几个物品进去使总价值最大。顾名思义,01背包,01的0代表不放进去,1代表放进去。对于每个物品i都有01两种选择。如果用最原始的枚举法。从第一个物品开始对每个物品进行枚举放还是不放。这样的算法实际上是一棵n层二叉树,所以时间复杂度为(2^n)。显然应该有更好的算法来解决。从构造这个二叉树的过程中其实就可以发现。每个节点其实是一个状态,每个状态含有两个关键参数CC\WW。比如:根节点(第0层)代表任何物品都不放进去,状态参数为0\W,前者代表此时总价值0,可用背包容量为W。第
阅读全文
posted @
2011-10-31 22:23
不是我干的
阅读(204)
推荐(0)
强连通图 学习笔记及tarjan模板
摘要:我是从算法导论看起的:定义:在一个有向图中,任意两个点都是互相可达的,则称为强连通图。解法步骤:1.先对每个节点dfs。计算出 每个节点的finishing time f[u]。2.对图进行倒置处理。3.对倒置图的每个节点,按照f【u】降序的顺序进行dfs。4.输出在步骤3中dfs时建立的每棵树的节点。这些树即分别是强连通分支。时间复杂度分析:在给定图G的邻接表表示的情况下,建立G倒置图的时间复杂度为O(V+E)。而dfs也是O(V+E),故整个时间复杂度是线性时间O(v+e).对这个解法的理解关键在理解finishing time的特点,算法导论书上对其有关键推论。根据上面算法写的粗糙代码:
阅读全文
posted @
2011-10-24 23:02
不是我干的
阅读(842)
推荐(0)
网络流sap算法模板及分析
摘要:网络流sap算法模板及分析
zz http://www.cnblogs.com/littlex/archive/2011/08/13/2137568.html
typedef struct node{ int v, w; struct node *nxt, *op;
}NODE; NODE edg[MM]; // 保存所有的边 NODE *link[NN]; // 记录节点所在链表的首节点 int h[NN]; // 距离标号,记录每个点到汇点的距离,这里的距离指的是层数 int num[NN]; // gap优化,标号为i的顶点个数 int M...
阅读全文
posted @
2011-09-25 20:17
不是我干的
阅读(204)
推荐(0)
Spfa算法 (模板源代码)
摘要:zzhttp://blog.sina.com.cn/s/blog_6ad20aef0100mc1a.htmlSpfa算法 (模板源代码) 这是Bellman Ford的改进算法。 算法介绍:建立一个队列,初始时队列里只有起始点,在建立一个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极大值,该点到他本身的路径赋为0)。然后执行松弛操作,用队列里有的点去刷新起始点到所有点的最短路,如果刷新成功且被刷新点不在队列中则把该点加入到队列最后。重复执行直到队列为空。 时间复杂度:期望的时间复杂度O(ke), 其中k为所有顶点进队的平均次数,可以证明k一般小于等于2。 通用模板设计(源代码...
阅读全文
posted @
2011-09-16 15:59
不是我干的
阅读(3175)
推荐(0)
图论网络流 Dinic算法和模板
摘要:zzhttp://blog.sina.com.cn/s/blog_61533c9b0100iawn.htmlDinic算法是基于分层思想的网络流算法,它的的效率一般比E-K算法高算法的思想:Dinic是在分阶段地在层次图中增广。它与最短路径增值算法不同之处是:在Dinic算法中,我们用一个dfs过程代替多次bfs来寻找阻塞流。下面给出其算法步骤:1、初始化流量,计算出剩余图 2、根据剩余图计算层次图。若汇点不在层次图内,则算法结束 3、在层次图内用一次dfs过程增广 4、转步骤2算法模板://时间复杂度O(V^2E) #include<iostream>#define Max 21
阅读全文
posted @
2011-09-14 17:35
不是我干的
阅读(983)
推荐(0)