There are a total of n courses you have to take, labeled from 0
to n-1
.
Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]
Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?
Example 1:
Input: 2, [[1,0]] Output: true Explanation: There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.
这道题费了一段时间,最后看discuss才用BFS方法做的。
因为要学的课对应的前提可能不止一个,所以这里字典的value对应set()格式。
queue存储的是可以学的课程。初始存储的是不需要前提课程的课。
然后利用backward,通过可以学的课(queue中的课),找到以这些课做为前提的课程。
接着删除这些要学的课的前提(queue中的课),当前提课程为0时,这门课程也放入queue中。
class Solution:
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
forward={i:set() for i in range(numCourses)}
backward=collections.defaultdict(set)
for i,j in prerequisites:
forward[i].add(j)
backward[j].add(i)
queue = collections.deque([node for node in forward if len(forward[node])==0])
while queue:
node = queue.popleft()
for req in backward[node]:
forward[req].remove(node)
if len(forward[req])==0:
queue.append(req)
forward.pop(node)
return not forward