Medium
拓扑排序
解题思路
0
表示没有指向当前节点的节点。那么这个节点应该是在拓扑排序较前的位置0
的节点放入队列中,从这些节点出发,向他们的下一个节点走。走完之后,将这个节点的入度设为-1
下一个节点的入度设置为0
,表示从图中删除这个节点Krahets大佬解题中的动图相当直观,可以看一下: 链接
以上,尝试写一下代码,AC!
python
class Solution:
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
adja = [[] for _ in range(numCourses)]
indeg = [0] * numCourses
for p in prerequisites:
indeg[p[0]] += 1
adja[p[1]].append(p[0])
queue = []
for i,d in enumerate(indeg):
if d == 0:
queue.append(i)
nums = 0
while len(queue):
cur = queue[0]
del queue[0]
nums += 1
indeg[cur] -= 1
for a in adja[cur]:
indeg[a] -= 1
if indeg[a] == 0:
queue.append(a)
return nums == numCourses