树的最大割问题 算法设计第十章习题9

题意:给定一棵有偶数个结点的树,树的每条边给定一个权值。求这棵树的最大割,要求树的两部节点数量相同。

思路:一般图上的最大割问题是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)的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值