สมมติว่าเรามีบริษัทที่มีพนักงาน n คนซึ่งมี ID เฉพาะสำหรับพนักงานแต่ละคน รหัสเหล่านี้มีตั้งแต่ 0 ถึง n - 1 หัวหน้าบริษัทมีคือรหัสที่มีรหัสประจำตัว พนักงานแต่ละคนมีผู้จัดการโดยตรงหนึ่งคนในอาร์เรย์ผู้จัดการโดยที่ manager[i] เป็นผู้จัดการโดยตรงของพนักงานคนที่ i ผู้จัดการ[headID] =-1 นอกจากนี้ยังรับประกันได้ว่าความสัมพันธ์ใต้บังคับบัญชามีโครงสร้างเหมือนต้นไม้ หัวหน้าบริษัทต้องการแจ้งข่าวด่วนให้พนักงานทุกคนของบริษัททราบ เขาสามารถแจ้งผู้ใต้บังคับบัญชาโดยตรงและจะแจ้งผู้ใต้บังคับบัญชาและอื่น ๆ จนกว่าพนักงานทุกคนจะรู้ข่าวด่วน พนักงานคนที่ i ต้องการ informTime[i] minutes เพื่อแจ้งผู้ใต้บังคับบัญชาโดยตรงทั้งหมดของเขา (ดังนั้นหลังจาก informTime[i] นาที ผู้ใต้บังคับบัญชาโดยตรงทั้งหมดของเขาสามารถเริ่มกระจายข่าวได้) เราต้องหาจำนวนนาทีที่ต้องแจ้งข่าวด่วนให้พนักงานทุกคนทราบ ดังนั้นหากอินพุตเป็นเหมือน n =6, headID =2, manager =[2,2,-1,2,2,2], infromTime =[0,0,1,0,0,0] แล้วผลลัพธ์ จะเป็น 1.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ยกเลิก :=0
-
กำหนดอาร์เรย์ที่เรียกว่ากราฟขนาด n ตั้งค่ารูท :=-1
-
สำหรับฉันอยู่ในช่วง 0 ถึงขนาดของอาร์เรย์ผู้จัดการ
-
u :=จัดการ[i] และ v :=i
-
ถ้าคุณเป็น -1 ให้ตั้งค่า root :=v และทำซ้ำต่อไป
-
แทรก v ลงในกราฟ[u]
-
-
กำหนดคิว q แทรกรูทลงใน q และกำหนดอาร์เรย์ที่เรียกว่าเวลา ขนาด n
-
จนกว่า q จะไม่ว่าง
-
curr :=องค์ประกอบด้านหน้าของ q และลบองค์ประกอบด้านหน้าออกจาก q
-
หากขนาดของรายการกราฟ[curr] เป็น 0 ให้ข้ามไปที่การวนซ้ำถัดไป
-
สำหรับผมอยู่ในช่วง 0 ถึงขนาดของรายการกราฟ[curr]
-
แทรกกราฟ[curr, i] ลงใน q
-
time[graph[curr, i]] :=เวลา[curr] + informTime[curr]
-
-
-
สำหรับฉันในช่วง 0 ถึง n – 1:ret :=สูงสุดของ ret และเวลา[i]
-
รีเทิร์น
ตัวอย่าง (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