---
# System prepended metadata

title: 1376. Time Needed to Inform All Employees
tags: [Leetcode, DFS, Medium]

---

# 1376. Time Needed to Inform All Employees
Link: https://leetcode.com/problems/time-needed-to-inform-all-employees/
###### tags: `Leetcode` `Medium` `DFS`
## 思路
### 思路一 top down dfs $O(N)$
首先建tree，然后dfs搜寻
### 思路二 bottom up dfs （省了一个建map的空间）$O(N^2)$
参考[这里](https://leetcode.com/problems/time-needed-to-inform-all-employees/discuss/532560/JavaC%2B%2BPython-DFS)
先想象出一个tree，然后对于每一个node来说，一个一个往上找，把informtime累加起来，做完之后把它的manager设成-1，这样再碰到这个node，就不会再加一遍informtime了
遍历所有node，每一个都这样做，最后得到的最大值就是答案
## Code
### 思路一 top down dfs
```java=
class Solution {
    public int numOfMinutes(int n, int headID, int[] manager, int[] informTime) {
        //map build tree
        //key manager value array of subordinates
        Map<Integer, List<Integer>> graph = new HashMap<Integer, List<Integer>>();
        int head = 0;
        for(int i=0;i<manager.length;i++){
            if(!graph.containsKey(manager[i])){
                graph.put(manager[i], new ArrayList<Integer>());
            }
            graph.get(manager[i]).add(i);
        }
        
        return dfs(headID, informTime, graph);
    }
    private int dfs(int head, int[] informTime,  Map<Integer, List<Integer>> graph){
        int max = 0;
        if(!graph.containsKey(head)) return max;
        else{
            for(int e:graph.get(head)){
                max = Math.max(max, dfs(e, informTime, graph));
            }
            return max+informTime[head];
        }
    }
}
```
### 思路二 bottom up dfs
java
```java=
class Solution {
    public int numOfMinutes(int n, int headID, int[] manager, int[] informTime) {
        int ans = 0;
        for(int i=0;i<manager.length;i++){
            ans = Math.max(ans, dfs(i, informTime, manager));
        }
        return ans;
    }
    private int dfs(int cur, int[] informTime, int[] manager){
        if(manager[cur]!=-1){
            informTime[cur] += dfs(manager[cur], informTime, manager);
            manager[cur]=-1;
        }
        return informTime[cur];
    }
}
```
c++
```cpp=
class Solution {
public:
    int numOfMinutes(int n, int headID, vector<int>& manager, vector<int>& informTime) {
        int ans = 0;
        for(int i=0; i<n; i++){
            ans = max(ans, dfs(i, manager, informTime));
        }
        return ans;
    }
    int dfs(int e, vector<int>& manager, vector<int>& informTime){
        if(manager[e]!=-1){
            informTime[e]+=dfs(manager[e], manager, informTime);
            manager[e]=-1;
        }
        return informTime[e];
    }
};
```