Problem
There are a total of numCourses courses you have to take, labeled from 0 to numCourses - 1. You are given an array prerequisites where prerequisites[i] = [ai, bi] indicates that you must take course bi first if you want to take course ai.
For example, the pair [0, 1], indicates that to take course 0 you have to first take course 1.
Return true if you can finish all courses. Otherwise, return false.
Algorithm
Topological sorting, storing the predecessors of each node, starting with the node that has no predecessors, and removing the edges with this node as a predecessor, loops until it ends or encounters a ring.
Code
class Solution:
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
maps = [[0] * numCourses for i in range(numCourses)]
prep = [0] * numCourses
plen = len(prerequisites)
for i in range(plen):
maps[prerequisites[i][0]][prerequisites[i][1]] = 1
prep[prerequisites[i][1]] += 1
for i in range(numCourses):
start = -1
for j in range(numCourses):
if not prep[j]:
start = j
prep[j] = -1
break
if -1 == start:
return 0
for j in range(numCourses):
if maps[start][j]:
prep[j] -= 1
return 1