检测循环中涉及的所有节点

时间:2019-05-18 05:00:15

标签: algorithm data-structures graph tree

我正在尝试解决https://leetcode.com/problems/find-eventual-safe-states/

我的方法是,简单地使给定图中的所有节点都参与循环。

这是我的代码:

class Solution {
    Set<Integer> result;
    //Set<Integer> overallVisited;
    int ct = 0;
    int[] overallVisited;

    public List<Integer> eventualSafeNodes(int[][] graph) {
        Set<Integer> visitedSet = new HashSet<Integer>();
        Set<Integer> allNodes = new HashSet<Integer>();
        overallVisited = new int[graph.length];

        result = new HashSet<Integer>();
        for(int i = 0; i < graph.length; i++) {
            allNodes.add(i);

            if(!result.contains(i) && overallVisited[i] == 0)dfs(i, new HashSet<Integer>(), graph);
         }
        allNodes.removeAll(result);

        return new ArrayList<Integer>(allNodes);
    }

    public boolean dfs(int root, Set<Integer> visitedSet, int[][] graph) {
        ct++;
        boolean isInCyle = false;
        int[] neighbors = graph[root];
        visitedSet.add(root);
        overallVisited[root] = 1;

        for(int neighbor : neighbors) {

            if(!visitedSet.contains(neighbor) && !result.contains(neighbor)) {
              isInCyle = dfs(neighbor, visitedSet, graph); 
              if(isInCyle) {
                result.add(root);
                visitedSet.remove(root);
                return true;
              }
            }
            else {
                // cycle
                result.add(root);
                visitedSet.remove(root);
                // don't process anymore since beyond this visitedSet
                // we won't add anything else
                return true;
            }
        }
      visitedSet.remove(root);
       return false;
    }
}

据我所知,这种方法是一种简单的“深度峡湾搜索”,同时试图查看某个特定节点是否参与循环。

根据我的计算,这是一个O(N + E)解决方案,其中N是图中节点的数量,E是边的数量。

我在这里错了吗?我问这个问题是因为我遇到了在线法官提出的“超过时限”错误。

非常感谢!

0 个答案:

没有答案