C++ 中通知所有员工所需的时间


假设一家公司有 n 名员工,每名员工都有一个唯一的 ID。这些 ID 的范围从 0 到 n - 1。公司的负责人是 ID 为 headID 的人。每个员工都有一个直属经理,在 manager 数组中给出,其中 manager[i] 是第 i 个员工的直属经理,manager[headID] = -1。并且保证从属关系具有树状结构。这里,公司负责人想要将一条紧急新闻通知给公司所有员工。他可以通知他的直属下属,然后他们会通知他们的下属,依此类推,直到所有员工都知道紧急新闻。第 i 个员工需要 informTime[i] 分钟来通知他所有的直属下属(因此,在 informTime[i] 分钟后,他所有的直属下属都可以开始传播新闻)。我们必须找到通知所有员工紧急新闻所需的时间(分钟)。所以,如果输入类似于 n = 6,headID = 2,manager = [2,2,-1,2,2,2],infromTime = [0,0,1,0,0,0],那么输出将是 1。

为了解决这个问题,我们将遵循以下步骤:

  • ret := 0

  • 定义一个名为 graph 的大小为 n 的数组,设置 root := -1

  • 对于 i 从 0 到 manager 数组的大小

    • u := managet[i] 且 v := i

    • 如果 u 为 -1,则设置 root := v,并进行下一次迭代

    • 将 v 插入到 graph[u] 中

  • 定义一个队列 q,将 root 插入到 q 中,并定义一个名为 time 的大小为 n 的数组

  • 直到 q 不为空

    • curr := q 的第一个元素,并从 q 中删除第一个元素

    • 如果 graph[curr] 列表的大小为 0,则跳过到下一次迭代

    • 对于 i 从 0 到 graph[curr] 列表的大小

      • 将 graph[curr, i] 插入到 q 中

      • time[graph[curr, i]] := time[curr] + informTime[curr]

  • 对于 i 从 0 到 n – 1:ret := ret 和 time[i] 的最大值

  • 返回 ret

示例(C++)

让我们看看以下实现,以便更好地理解:

 实时演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int numOfMinutes(int n, int headID, vector<int>& manager, vector<int>& informTime) {
      int ret = 0;
      vector <int> graph[n];
      int root = -1;
      for(int i = 0; i < manager.size(); i++){
         int u = manager[i];
         int v = i;
         if(u == -1) {
            root = v;
            continue;
         }
         graph[u].push_back(v);
      }
      queue <int> q;
      q.push(root);
      vector <int> time(n);
      while(!q.empty()){
         int curr = q.front();
         q.pop();
         if(!graph[curr].size()) continue;
         for(int i = 0; i < graph[curr].size(); i++){
            q.push(graph[curr][i]);
            time[graph[curr][i]] = time[curr] + informTime[curr];
         }
      }
      for(int i = 0; i <n; i++)ret = max(ret, time[i]);
      return ret;
   }
};
main(){
   vector<int> v = {2,2,-1,2,2,2}, v1 = {0,0,1,0,0,0};
   Solution ob;
   cout << (ob.numOfMinutes(6, 2, v, v1));
}

输入

6
2
[2,2,-1,2,2,2]
[0,0,1,0,0,0]

输出

1

更新于: 2020-04-29

413 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告