刚开始没思路,还以为是利用二维矩阵直接标记节点间的有向路径,最后循环遍历就能得到结果,结果最后发现方向是错的,之后看了大佬们写的代码,发现原来是用出度来实现节点是否安全的。
照着大佬们的思路重新写了一遍,代码如下:
class Solution:
def eventualSafeNodes(self, graph: List[List[int]]) -> List[int]:
#节点个数N
N=len(graph)
#safe数组记录N个节点是否安全,1表示安全,0表示不安全
safe=[0 for _ in range(N)]
#记录每个节点的出度,出度为0的节点安全
outDegree=[0 for _ in range(N)]
#逆邻接链表,就是有向边进行反向
reverseGraph=[[] for _ in range(N)]
#计算出度并构建逆邻接链表
for i in range(N):
outDegree\[i\] = len(graph\[i\])#出度计算
for j in graph\[i\]:#反向边
reverseGraph\[j\].append(i)
#统计出度为0的节点
safeQueue=\[\]
for i in range(N):
if outDegree\[i\]==0:
safeQueue.append(i)
#对出度为0的节点进行反向查找
while safeQueue:
node = safeQueue.pop(0)
safe\[node\]=1
for i in reverseGraph\[node\]:
outDegree\[i\]-=1
if outDegree\[i\]==0:
safeQueue.append(i)
#统计安全节点
res=\[\]
for i in range (N):
if safe\[i\]==1:
res.append(i)
return res
当然,利用dfs查重也是可以的,但是太慢了,就不考虑了
手机扫一扫
移动阅读更方便
你可能感兴趣的文章