树的最大割问题 算法设计第十章习题9
2015-10-02 22:00
369 查看
题意:给定一棵树,树的每条边给定一个权值。求这棵树的最大割。
思路:一般图上的最大割问题是NP完全的,归约可以从Partition问题来归约(见Krap的21的NPC问题那篇论文)。而在树上,这是可以在多项式时间内进行解决的。思路就是树形dp。
具体来说可以设dp[x][k]表示在以x为根的子树内,x所在的部有k个节点形成的最大割值。那么dp[x][k]的值可以由儿子的情况来决定,类似背包的思想。对每个儿子y,可以通过分类x和y是否属于同一部来构造状态转移方程。具体来说,对于dp[y][b],可以更新dp[x][k] = max(dp[x][k] , dp[x][k-b]+dp[y][b] , dp[x][k-(num(y)-b)]+dp[y][b]+w(x,y))。上述中间的式子表示x和y同属于一部,所以x所在部的点数加上y所在部的点数即可,而且x和y直接的权值不计入;而后边的式子则表示x和y不属于一部,num(y)表示y所在子树的结点总数,w(x,y)表示x和y之间的权值。
这样一来,每个结点的更新时间的n^2的,又一共有O(n)个结点,所以总共的时间复杂度是O(n^3)的。
思路:一般图上的最大割问题是NP完全的,归约可以从Partition问题来归约(见Krap的21的NPC问题那篇论文)。而在树上,这是可以在多项式时间内进行解决的。思路就是树形dp。
具体来说可以设dp[x][k]表示在以x为根的子树内,x所在的部有k个节点形成的最大割值。那么dp[x][k]的值可以由儿子的情况来决定,类似背包的思想。对每个儿子y,可以通过分类x和y是否属于同一部来构造状态转移方程。具体来说,对于dp[y][b],可以更新dp[x][k] = max(dp[x][k] , dp[x][k-b]+dp[y][b] , dp[x][k-(num(y)-b)]+dp[y][b]+w(x,y))。上述中间的式子表示x和y同属于一部,所以x所在部的点数加上y所在部的点数即可,而且x和y直接的权值不计入;而后边的式子则表示x和y不属于一部,num(y)表示y所在子树的结点总数,w(x,y)表示x和y之间的权值。
这样一来,每个结点的更新时间的n^2的,又一共有O(n)个结点,所以总共的时间复杂度是O(n^3)的。
相关文章推荐
- maven的集成
- solaris 源代码
- IOS第二天(点语法、构造方法与discription方法)
- OC中的self和super(转载)
- 第4周—项目3.(1)结点逆置
- ocp-49
- 简易四则运算
- git命令评测
- ocp-48
- ocp-47
- Swift 运算符
- codeforces-4C-Registration system
- 2015 四川省赛 B. Carries
- 浅析C/C++中的switch/case陷阱
- ocp-46
- Kobuki(turtlebot底盘)通信方式
- Java用freemarker导出word文档
- 将50号部门的员工工资设置为30号部门的平均工资加300
- [转]C#中yield用法
- ocp-45