树形dp

树形dp

$op, f[i+1][u]+=f[i][v], u<-v$
https://ac.nowcoder.com/acm/contest/109081/E

最大独立集:选择的节点不相邻,其中的最大值

$i:节点,j:是否选择当前节点$
$dp[u][0]=0,dp[u][1]=w[u],后序遍历$
$dp[u][0]+=max(dp[v][1],dp[v][0]);$
$dp[u][1]+=dp[v][0]$

最小点覆盖:选最少的节点使得所有边至少有一个端点选择

以u为根节点的子树,不选u就必须选v,选u可选可不选v
$dp[u][0]+=dp[v][1]$
$dp[u][1]+=min(dp[v][1],dp[v][0])$

最小点覆盖=总节点数−最大独立集

树的直径:最长路径

记录每个节点上的最大值与次大值

树的中心:该结点离树中的其他结点,最远距离最近。

在直径上,存最大边与次大边

树形背包
AcWing 10. 有依赖的背包问题(思路不同于dxc,但是个人感觉更好理解) - AcWing

//01背包的逆序遍历,a<b<c;求c时会用到a,此时的a不是c的上层
for(int i=siz[u];i>=0;i--)//容积
{
    for(int j=0;j<=siz[v];j++)
    {
        dp[u][i]=max(dp[u][i],dp[u][i-j]+dp[v][j]);
    }
}
siz:u<-v

对有权值的边做dfs
i->i-1,dp[u][i]=max(,dp[u][i-j]+dp[v][j]+w);

最大子树和

dp[u]=max(dp[u],0);
posted on 2025-05-28 21:31  王不留航  阅读(10)  评论(0)    收藏  举报