Python并行课程
假设有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