拓扑排序
直接按照模板写,运用队列依次遍历节点。
class Solution:
def checkIfPrerequisite(self, numCourses: int, prerequisites: List[List[int]], queries: List[List[int]]) -> List[bool]:
# 连通矩阵,f[i][j]==True表示i是j的先决条件。
n=numCourses
f=[[False]*n for _ in range(n)]
# 存储节点后续节点
g=[[]for _ in range(n)]
# 节点的入度大小
indeg=[0]*n
# 初始化节点后续节点,节点的入度
for a,b in prerequisites:
g[a].append(b)
indeg[b]+=1
# 将入度为0的节点加入队列
q=deque([i for i,x in enumerate(indeg) if x==0])
# 当列表不空
while q:
# 取出一个节点
i=q.popleft()
# 依次遍历后继节点
for j in g[i]:
# 存在[i,j],则将f[i][j]设为True
f[i][j]=True
# 依次遍历所有节点,若存在f[h][i]为True,则将f[h][j]也设为True
for h in range(n):
if f[h][i]:
f[h][j]=True
# i到j处理完毕,将j的入度减1
indeg[j]-=1
# 若节点j入度为0,则加入队列
if indeg[j]==0:
q.append(j)
# 依次返回查询结果
return [f[a][b] for a,b in queries]
Comments NOTHING