1443. Minimum Time to Collect All Apples in a Tree

23 篇文章 0 订阅
给定一个无向树,树上有若干个节点编号从0到n-1,其中一些节点包含苹果。你需要从节点0出发并在每条边花费1秒时间。返回收集所有树上苹果并回到节点0所需的最短时间。题目提供了连接节点的边和包含苹果的节点信息,需要通过建树和递归的方法求解。
摘要由CSDN通过智能技术生成

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:

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]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值