今日题目

https://leetcode.com/problems/find-eventual-safe-states/description/

注意

出边指的是该节点的任意一条边,包括自环。

思路

唯一的终止节点是没有出边的节点。

然后我们需要找出哪些节点连向这些终止节点。

因此,可以使用递归(或任何 LIFO 算法)来解决这道题。

方法

  • 使用 DFS。
  • 如果找到一个没有出边的节点,则它是终止节点。
  • 如果发现自环,环中所有节点均不安全。
  • 如果一个节点只连向安全节点,则它本身也是安全的。

复杂度

  • 时间复杂度:$O(N)$,每个节点只会被访问一次。
  • 空间复杂度:$O(N)$。

代码


class Solution:

    def eventualSafeNodes(self, graph: List[List[int]]) -> List[int]:

        n = len(graph)

        safety = [-1] * n

        vis = [0] * n

        ans = []


        def dfs(x):

            if safety[x] != -1:

                return safety[x]

            if vis[x] == 1:

                safety[x] = 0

                return 0

            vis[x] = 1

            if len(graph[x]) == 0:

                safety[x] = 1

                return 1


            res = 0


            for to in graph[x]:

                res += dfs(to)


            if res == len(graph[x]):

                safety[x] = 1

            else:

                safety[x] = 0

            return safety[x]


        for i in range(n):

            if(dfs(i) == 1):

                ans.append(i)


        return ans