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)