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

  • 相关阅读:
    BUUCTF-[GYCTF2020]Blacklist 1 思路
    [强网杯 2019]随便注 WriteUp(three way)思路
    [GXYCTF2019]Ping Ping Ping 1思路
    [ACTF2020 新生赛]Include 思路
    [极客大挑战 2019]Secret File 思路
    [SUCTF 2019]EasySQL 思路
    java环境变量配置 详细
    [极客大挑战 2019]Upload 思路
    [极客大挑战 2019]Http 思路
    [ACTF2020 新生赛]Exec 思路
  • 原文地址:https://www.cnblogs.com/lhdb/p/12670772.html
Copyright © 2020-2023  润新知