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 time and uses space.