您的位置:首页 > 其它

树的最大割问题 算法设计第十章习题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)的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: