Определение ацикличности графа для топологической сортировки

1

Я успешно реализовал топологический алгоритм сортировки, но у меня возникли проблемы с выяснением, когда нужно делать исключение, когда введенный граф не ацикличен. Внутри алгоритма есть способ проверить это, используя степень? Или что-то еще в этом отношении?

public static List<String> topologicalSort(Graph graph) {

    if(graph.getDirected() == false)
        throw new UnsupportedOperationException();

    Queue<Vertex> queue = new LinkedList<Vertex>();

    HashMap<String, Vertex> tempMap = graph.getVertices();
    for(Vertex vertex : tempMap.values()) {
        if(vertex.getInDegree() == 0)
            queue.add(vertex);
    }

    if(queue.isEmpty())
        throw new UnsupportedOperationException();

    ArrayList<String> returnList = new ArrayList<String>();
    while(!queue.isEmpty()) {
        Vertex tempVert = queue.poll();
        returnList.add(tempVert.getName());
        tempVert.setVisited(true);
        for(Edge edge : tempVert.getEdges()) {

           if(edge.getOtherVertex().getVisited() == true)
                throw new UnsupportedOperationException();
           edge.getOtherVertex().setVisited(true);
           edge.getOtherVertex().decInDegree();

           if(edge.getOtherVertex().getInDegree() == 0)
               queue.add(edge.getOtherVertex());
        }

    }

    return returnList;
}
  • 0
    Какой алгоритм? Вы не опубликовали код.
  • 2
    Просто пометьте каждый узел, для которого вы выполняете итерацию, как «посещенный», и проверьте каждый новый узел, с которым вы работали, если он уже был «посещен», и, если это так, выведите исключение.
Показать ещё 2 комментария
Теги:
topological-sort

2 ответа

3
Лучший ответ

Если вход представляет собой график с aa циклом, то вы достигнете точки в алгоритме, в котором вы не добавили все Узлы к выходу, но не имеете никаких дополнительных элементов в очереди (вы не можете добавить любой узел цикла в очередь из-за циклического отношения).

Т.е. проверьте returnList.size() == graph.nodeCount() после цикла while (true означает, что ациклический ввод, вход для false средств имеет цикл).

graph.nodeCount() должно быть числом узлов в графе в начале метода.

  • 0
    Это кажется лучше, чем у меня :) должно быть правильно.
  • 0
    Отлично. Просто и просто то, что я искал.
1

Вы можете использовать Tarjan SCC для поиска всех сильно связанных компонентов в ориентированном графе, если есть компонент размером> 1 (более одного узла в этом компоненте), поэтому в этом компоненте есть цикл.

Вы можете остановиться, как только алгоритм найдет сильно связанный компонент с размером больше 1.

  • 0
    Хотя я понимаю, что это сработает, эффективность важна. Нет ли другого способа в текущей настройке моего кода, который бы позволил провести простую проверку?
  • 0
    @ user3743340 взгляните на это

Ещё вопросы

Сообщество Overcoder
Наверх
Меню