Определить все узлы, вовлеченные в цикл - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь решить 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 - количество ребер.

Я здесь не прав? Я спрашиваю об этом, так как я сталкиваюсь с ошибкой превышения лимита времени от интернет-судьи.

Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...