Python 并行课程
假设有 N 门课程,编号从 1 到 N。我们还有一个关系数组 relations,其中 relations[i] = [X, Y] 表示课程 X 和课程 Y 之间的先修关系。这意味着必须先学习课程 X,才能学习课程 Y。
在一个学期中,我们可以学习任意数量的课程,只要我们已经学习了我们正在学习的课程的所有先修课程。我们必须找到学习所有课程所需的最小学期数。如果无法学习所有课程,则返回 -1。
例如,如果输入为 N = 3,relations = [[1,3],[2,3]],则输出为 2,因为在第一学期学习课程 1 和 2,在第二学期学习课程 3。
为了解决这个问题,我们将遵循以下步骤:
courses := n
visited := 一个大小为 n+1 的数组,并将其全部填充为 false
queue := 一个新的列表
graph := 一个包含 n+1 个子列表的列表
in_degree := 一个大小为 n+1 的数组,并将其全部填充为 0
对于 relations 中的每个 i,执行:
将 i[1] 插入到 graph[i[0]] 的末尾
in_degree[i[1]] := in_degree[i[1]] + 1
semester := 1
对于范围 1 到 n+1 中的每个 i,执行:
如果 in_degree[i] 为零,则
将 i 插入到 queue 的末尾
visited[i] := True
semester := 1
courses := courses - queue 的大小
当 queue 不为空且 courses 不为零时,执行:
current_size := queue 的大小
当 current_size 不为零时,执行:
current_course := queue[0]
从 queue 中删除第一个元素
current_size := current_size - 1
对于 graph[current_course] 中的每个 i,执行:
in_degree[i] := in_degree[i] - 1
如果 i 未被访问且 in_degree[i] 为零,则
courses := courses - 1
将 i 插入到 queue 的末尾
visited[i]:= True
semester := semester + 1
如果 courses 为 0,则返回 semester,否则返回 -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