Leetcode802-找到最终的安全状态(Python3)
阅读原文时间:2023年07月11日阅读:1

刚开始没思路,还以为是利用二维矩阵直接标记节点间的有向路径,最后循环遍历就能得到结果,结果最后发现方向是错的,之后看了大佬们写的代码,发现原来是用出度来实现节点是否安全的。

照着大佬们的思路重新写了一遍,代码如下:

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查重也是可以的,但是太慢了,就不考虑了