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