假设有N个课程,它们的编号从1到N。我们还给出了一个关系数组,其中关系[i] = [X,Y]表示课程X和课程Y之间的先决条件关系。因此,这意味着X课程必须在Y课程之前学习。
一个学期,只要我们已经学习了所学课程的所有前提条件,就可以学习任何数量的课程。我们必须找到学习所有课程所需的最少学期数。如果无法学习所有课程,则返回-1。
因此,如果输入像N = 3,关系= [[1,3],[2,3]],则输出将为2,因为在第一学期,研究课程1和2。在第二学期,学习课程3。
为了解决这个问题,我们将遵循以下步骤-
课程:= n
Visited:=一个大小为n + 1的数组,并用false填充它
队列:=一个新列表
图:= n + 1子列表的列表
in_degree:=大小为n + 1的数组,并用0填充
对于关系中的每个我,
在图[i [0]]的末尾插入i [1]
in_degree [i [1]]:= in_degree [i [1]] + 1
semeseter:= 1
对于范围1到n + 1的i
在队列末尾插入i
访问过[i]:=正确
如果in_degree [i]为零,则
学期:= 1
课程:=课程-队列大小
当队列不为空且课程非零时,执行
current_course:=队列[0]
从队列中删除第一个元素
current_size:= current_size-1
对于图[current_course]中的每个i,执行
课程:=课程-1
在队列末尾插入i
Visited [i]:=真
in_degree [i]:= in_degree [i]-1
如果未访问i并且in_degree [i]为零,则
current_size:=队列大小
当current_size不为零时,执行
学期:=学期+1
如果课程为0,则返回学期,否则为-1
让我们看下面的实现以更好地理解-
class Solution(object): def minimumSemesters(self, n, relations): courses = n visited = [False for i in range(n+1)] queue = [] graph = [[] for i in range(n+1)] in_degree = [0 for i in range(n+1)] for i in relations: graph[i[0]].append(i[1]) in_degree[i[1]]+=1 semeseter = 1 for i in range(1,n+1): if not in_degree[i]: queue.append(i) visited[i] = True semester = 1 courses -= len(queue) while queue and courses: current_size = len(queue) while current_size: current_course = queue[0] queue.pop(0) current_size-=1 for i in graph[current_course]: in_degree[i]-=1 if not visited[i] and not in_degree[i]: courses-=1 queue.append(i) visited[i]=True semester+=1 return semester if not courses else -1 ob = Solution()print(ob.minimumSemesters(3,[[1,3],[2,3]]))
3, [[1,3],[2,3]]
输出结果
-1