Graph Theory37 sections · 1633 units
Open in Course

Choosing Capital - Implementation

(Rerooting with directions)

Here is the solution:

dp = array of size n

function dfs1(u, p):
    for (v, dir) in adj[u]:
        if v == p:
            continue
        dfs1(v, u)
        dp[u] = dp[u] + dp[v] + dir

function dfs2(u, p, up):
    dp[u] = dp[u] + up
    for (v, dir) in adj[u]:
        if v == p:
            continue
        change = 1 if dir == 0 else -1
        dfs2(v, u, dp[u] - dp[v] - dir + change)

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