Problem Statement:

TCS is working on a new project called “Testvita“. There are N modules in the project. Each module i has a completion time denoted in the number of hours Hi and may depend on other modules. If module x depends on module y then one needs to complete y before x.

As a project manager, you are asked to deliver the project as early as possible. Provide an estimation of the amount of time required to complete the project.

Input Format:

The first line contains T, the number of test cases.
For each test case:

  1. The first line contains N, the number of modules.
  2. Next N lines, each contains:
    • i – module id
    • Hi – number of hours it takes to complete the module
    • D – set of module ids that i depends on – integers delimited by space

Output Format:

Output the minimum number of hours required to deliver the project.

Constraints:

  • 1 <= T <= 10
  • 0 < N < 1000; number of modules
  • 0 < i <= N; module Id
  • 0 < Hi < 60; number of hours it takes to complete the module i
  • 0 <= |D| < N; number of dependencies
  • 0 < Dk <= N; module Id of dependencies

Example 1:

Input:
1
5
1 5 0
2 6 1
3 3 2
4 2 3
5 1 3

Output:
16

Code:

from collections import deque

def testvita(n, hours, in_degree, graph):
	queue = deque()
	total_hours = [0] * (n + 1)
	max_time = 0
	for key, value in in_degree.items():
		if value == 0:
			total_hours[key] = hours[key]
			queue.append(key)

	while queue:
		curr_module_id = queue.popleft()
		for nbr in graph[curr_module_id]:
			if nbr != 0:
				in_degree[nbr] -= 1
				if in_degree[nbr] == 0:
					queue.append(nbr)
				total_hours[nbr] = total_hours[curr_module_id] + hours[nbr]
				max_time = max(max_time, total_hours[nbr])

	return max_time


if __name__ == '__main__':
	
	testcases = int(input())
	for t in range(testcases):
		n = int(input()) # number of modules
		hours = dict() # completion time of each module
		graph = dict() # module_id : [list of neighbors]
		in_degree = dict() # in degree of each node
	
		for node in range(1, n + 1):
			in_degree[node] = 0
			graph[node] = list()

		for i in range(n):

			module_info = list(map(int, input().split()))
			module_id = module_info[0]
			module_completion_time = module_info[1]
			module_prerequisites = module_info[2 : ]

			hours[module_id] = module_completion_time
			for nbr in module_prerequisites:
				if nbr != 0:
					graph[nbr].append(module_id)

			for nbr in module_prerequisites:
				if nbr != 0:
					in_degree[module_id] += 1

		ans = testvita(n, hours, in_degree, graph)
		print(ans)