刚开始没思路,还以为是利用二维矩阵直接标记节点间的有向路径,最后循环遍历就能得到结果,结果最后发现方向是错的,之后看了大佬们写的代码,发现原来是用出度来实现节点是否安全的。
照着大佬们的思路重新写了一遍,代码如下:
1 class Solution: 2 def eventualSafeNodes(self, graph: List[List[int]]) -> List[int]: 3 #节点个数N 4 N=len(graph) 5 #safe数组记录N个节点是否安全,1表示安全,0表示不安全 6 safe=[0 for _ in range(N)] 7 #记录每个节点的出度,出度为0的节点安全 8 outDegree=[0 for _ in range(N)] 9 #逆邻接链表,就是有向边进行反向 10 reverseGraph=[[] for _ in range(N)] 11 12 #计算出度并构建逆邻接链表 13 for i in range(N): 14 outDegree[i] = len(graph[i])#出度计算 15 for j in graph[i]:#反向边 16 reverseGraph[j].append(i) 17 18 #统计出度为0的节点 19 safeQueue=[] 20 for i in range(N): 21 if outDegree[i]==0: 22 safeQueue.append(i) 23 #对出度为0的节点进行反向查找 24 while safeQueue: 25 node = safeQueue.pop(0) 26 safe[node]=1 27 for i in reverseGraph[node]: 28 outDegree[i]-=1 29 if outDegree[i]==0: 30 safeQueue.append(i) 31 #统计安全节点 32 res=[] 33 for i in range (N): 34 if safe[i]==1: 35 res.append(i) 36 return res
当然,利用dfs查重也是可以的,但是太慢了,就不考虑了