题目描述
拓扑排序模板
q = [i for i in range(n) if inDeg[i]==0]
while q:
id = q.pop(0)
for nid in rg[id]:
inDeg[nid]-=1
if inDeg[nid]==0:
q.append(nid)
其中,inDeg是入度数组,rg是有向无环图,q为队列
图解参考:图解拓扑排序参考
说明:
- 拓扑排序针对有向无环图,排序后入度不为零的则是环
- 拓扑排序步骤:构图、每次找到入度为0的入队直到队列为空
- 难点一般在建图
- 拓扑排序结果不唯一
题目分析
将边反向,构建反图,在反图中,“安全结点”即入度为0的点,使用拓扑排序找到所有”安全结点“
python实现
class Solution:
def eventualSafeNodes(self, graph: List[List[int]]) -> List[int]:
n = len(graph)
rg = [[] for _ in range(n)]
inDeg = [0]*n
# 根据graph构建反图
for i in range(n):
for j in range(len(graph[i])):
rg[graph[i][j]].append(i)
inDeg[i]+=1
# print(inDeg)
# print(rg)
# 寻找入度为0的入队
q = [i for i in range(n) if inDeg[i]==0]
while q:
id = q.pop(0)
for nid in rg[id]:
inDeg[nid]-=1
if inDeg[nid]==0:
q.append(nid)
ans = []
# 按照顺序输出
for i in range(n):
if inDeg[i]==0:
ans.append(i)
return ans