题意:给定一棵有偶数个结点的树,树的每条边给定一个权值。求这棵树的最大割,要求树的两部节点数量相同。
思路:一般图上的最大割问题是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)的。