class Solution:
def minTime(self, n: int, edges: List[List[int]], hasApple: List[bool]) -> int:
# step1 , build bi-directional tree, create map with linked list to represent child nodes / edges
self.tree = collections.defaultdict(list)
self.visited = set()
for parent, child in edges:
if child in self.tree[0]: # make sure if given [from, to] list is ordered
self.tree[child].append(parent)
continue
self.tree[parent].append(child)
# step2, dfs, check if cur node has been visited, if not res = current res + dfs(child)
def dfs(node):
self.visited.add(node)
res = 0
for child in self.tree[node]: # iterate list in the dictionray with key `node`
if child in self.visited:
continue
res += dfs(child)
if (res> 0 or hasApple[node]) and node: # if apple does exist and it's not at root node, if apple is at root node, no time cost;
res += 2
return res
# check if cur node in hasApple, if yes, res +2
return dfs(0)