# 1443. Minimum Time to Collect All Apples in a Tree
###### tags: `LeetCode`
## **Link**
https://leetcode.com/problems/minimum-time-to-collect-all-apples-in-a-tree/
## **Code**
```cpp=
class Solution {
public:
void setParent(int n, vector<int> &parent, vector<int> &needDfs)
{
if(needDfs[parent[n]]==0)
{
needDfs[parent[n]]=1;
setParent(parent[n],parent,needDfs);
}
}
int dfs(int n, vector<vector<int>> &child, vector<int> &needDfs)
{
int rt=0,sz=child[n].size();
for(int i=0;i<sz;i++)
{
if(needDfs[child[n][i]]==1)
{
rt=rt+2+dfs(child[n][i],child,needDfs);
}
}
return rt;
}
int minTime(int n, vector<vector<int>>& edges, vector<bool>& hasApple)
{
vector<int> parent(n),needDfs(n,0); //父節點陣列、化簡樹陣列
set<int> inTree; //存已經在樹裡面的點
inTree.insert(0);
needDfs[0]=1;
vector<vector<int>> child(n); //子節點陣列
for(int i=0;i<n;i++)
parent[i]=i;
int sz=edges.size(),way;
for(int i=0;i<sz;i++) //建單向樹
{
way=(inTree.find(edges[i][0])!=inTree.end())?1:0;
inTree.insert(edges[i][way]);
parent[edges[i][way]]=edges[i][(way+1)%2];
child[edges[i][(way+1)%2]].push_back(edges[i][way]);
if(hasApple[edges[i][way]])
{
needDfs[edges[i][way]]=1;
setParent(edges[i][way],parent,needDfs);
}
}
return dfs(0,child,needDfs); //dfs
}
};
```
## date
**2023.01.11**
{%hackmd @nnks8908/background_leetcode %}