# DFS自底向上
'''
class Solution:
def numOfMinutes(self, n: int, headID: int, manager, informTime) -> int:
visited = [False] * n
res = 0
for i in manager:
# 曾經經過的,說明計算過
if visited[i]:
continue
total = 0
while i != -1:
visited[i] = True
total += informTime[i]
i = manager[i]
if res < total:
res = total
return res
'''
'''
思路:DFS自頂向下
from collections import defaultdict
class Solution:
def numOfMinutes(self, n: int, headID: int, manager, informTime) -> int:
a = defaultdict(list)
for i in range(len(manager)):
a[manager[i]].append(i)
def find(n, headID, manager, informTime):
# 明到了最下屬
if informTime[headID] == 0:
return 0
# 如果不是最下屬,找孩子的最大時間
time = 0
# 防止遍歷找,就通過了
for i in a[headID]:
# 找下屬的最大值
t = find(n, i, manager, informTime) + informTime[headID]
if time < t:
time = t
return time
t = find(n, headID, manager, informTime)
return t
'''
# BFS
from queue import Queue
from collections import defaultdict
class Solution:
def numOfMinutes(self, n: int, headID: int, manager, informTime) -> int:
q = Queue()
tmp = defaultdict(list)
for i in range(len(manager)):
if manager[i] == -1:
continue
tmp[manager[i]].append(i)
q.put((headID, 0))
result = 0
while not q.empty():
this_id, val = q.get()
for id_ in tmp[this_id]:
q.put((id_, val+informTime[this_id]))
result = max(result, val+informTime[this_id])
return result
s = Solution()
n = 6
headID = 2
manager = [2,2,-1,2,2,2]
informTime = [0,0,1,0,0,0]
s.numOfMinutes(n, headID, manager, informTime)