Graph Theory37 sections · 1633 units
Open in Course

Tree Matching - Implementation

(Subtree DP with states)

Here is the solution:

dp = 2D array of size n x 2

function dfs(u, p):
    dp[u][0] = 0
    dp[u][1] = 0
    sum = 0
    for v in adj[u]:
        if v == p:
            continue
        dfs(v, u)
        sum = sum + max(dp[v][0], dp[v][1])
    dp[u][0] = sum

    for v in adj[u]:
        if v == p:
            continue
        dp[u][1] = max(dp[u][1], 1 + dp[v][0] + (sum - max(dp[v][0], dp[v][1])))

dfs(1, 0)
print max(dp[1][0], dp[1][1])

This runs in O(n)O(n) time and uses O(n)O(n) space.