1443. Minimum Time to Collect All Apples in a Tree

Given an undirected tree consisting of n vertices numbered from 0 to n-1, which has some apples in their vertices. You spend 1 second to walk over one edge of the tree. Return the minimum time in seconds you have to spend in order to collect all apples in the tree starting at vertex 0 and coming back to this vertex.

The edges of the undirected tree are given in the array edges, where edges[i] = [fromi, toi] means that exists an edge connecting the vertices fromi and toi. Additionally, there is a boolean array hasApple, where hasApple[i] = true means that vertex i has an apple, otherwise, it does not have any apple.

 

Example 1:

1443. Minimum Time to Collect All Apples in a Tree_第1张图片

Input: n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], hasApple = [false,false,true,false,true,true,false]
Output: 8 
Explanation: The figure above represents the given tree where red vertices have an apple. One optimal path to collect all apples is shown by the green arrows.  

Example 2:

 

Input: n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], hasApple = [false,false,true,false,false,true,false]
Output: 6
Explanation: The figure above represents the given tree where red vertices have an apple. One optimal path to collect all apples is shown by the green arrows.  

Example 3:

Input: n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], hasApple = [false,false,false,false,false,false,false]
Output: 0

 

Constraints:

  • 1 <= n <= 10^5
  • edges.length == n-1
  • edges[i].length == 2
  • 0 <= fromi, toi <= n-1
  • fromi < toi
  • hasApple.length == n

思路:建树,然后递归

class Solution(object):
    def minTime(self, n, edges, hasApple):
        """
        :type n: int
        :type edges: List[List[int]]
        :type hasApple: List[bool]
        :rtype: int
        """
        from collections import defaultdict
        adj = defaultdict(list)
        for s,t in edges:
            adj[s].append(t)
            adj[t].append(s)

        tree = defaultdict(list)
        vis = set([0])
        q = [0]
        while q:
            s = q.pop()
            for t in adj[s]:
                if t in vis: continue
                tree[s].append(t)
                vis.add(t)
                q.append(t)

        # memo = {}
        def helper(s):
            if s not in tree:
                return 0,hasApple[s]
            res = 0
            tt = [helper(t) for t in tree[s]]
            for su,flag in tt:
                if flag:
                    res += su+2
            # memo[s] = (res, any(t[1] for t in tt) or hasApple[s])
            return res, any(t[1] for t in tt) or hasApple[s]

        # helper(0)
        return helper(0)[0]

 

你可能感兴趣的:(leetcode,Tree)