树上的 DP - 求树的最大匹配数

设树的根为1。设 f[i] 为 i 为覆盖点时以 i 为根的子树的最大匹配数,g[i] 为 i 为未盖点时以 i 为根的子树的最大匹配数。则有:

g[i]=max{f[son],g[son]}

f[i]=max{g[i]max(f[son],g[son])+g[son]+1}

INT f[maxn], g[maxn];
void dfs(INT node)
{
    f[node] = g[node] = 0;
    for(int i = head[node]; i; i = edges[i].next)
    {
        INT to = edges[i].to;
        dfs(to);
        g[node] += std::max(f[to], g[to]);
    }
    for(int i = head[node]; i; i = edges[i].next)
    {
        INT to = edges[i].to;
        f[node] = std::max(f[node], g[node] - std::max(f[to], g[to]) + g[to] + 1);
    }
}

最终答案即为 max(f[1],g[1])

你可能感兴趣的:(OI,树)