1443.Minimum Time to Collect All Apples in a Tree
===
###### tags: `Medium`,`Tree`,`DFS`,`BFS`,`Hash Table`
[1443. Minimum Time to Collect All Apples in a Tree](https://leetcode.com/problems/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 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]` = [$a_i$, $b_i$] means that exists an edge connecting the vertices $a_i$ and $b_i$. 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:**
![](https://assets.leetcode.com/uploads/2020/04/23/min_time_collect_apple_1.png)
```
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:**
![](https://assets.leetcode.com/uploads/2020/04/23/min_time_collect_apple_2.png)
```
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 <= $a_i$ < $b_i$ <= `n` - 1
* $from_i$ < $to_i$
* `hasApple.length` == `n`
### 解答
#### Javascript
```javascript=
function minTime(n, edges, hasApple) {
const graph = new Array(n).fill(0).map(() => []);
for (const [v1, v2] of edges) {
graph[v1].push(v2);
graph[v2].push(v1);
}
return dfs(0, -1, graph, hasApple);
}
function dfs(node, parent, graph, hasApple) {
let totalTime = 0;
let childTime = 0;
for (const child of graph[node]) {
if (child === parent) continue;
childTime = dfs(child, node, graph, hasApple);
if (childTime || hasApple[child]) {
totalTime += childTime + 2;
}
}
return totalTime;
}
```
>參考官網的解答寫的,第一次寫直接做dfs掃過一遍把有遇到蘋果的距離直接乘2,忘記會重複計算,有夠蠢。
>[name=Marsgoat][time=Feb 20, 2023]
### Reference
[回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)