Leetcode802-找到最终的安全状态(Python3)

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

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

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

 

posted @ 2020-04-10 00:30  炮火覆盖  阅读(196)  评论(0编辑  收藏  举报