Я успешно реализовал топологический алгоритм сортировки, но у меня возникли проблемы с выяснением, когда нужно делать исключение, когда введенный граф не ацикличен. Внутри алгоритма есть способ проверить это, используя степень? Или что-то еще в этом отношении?
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;
}
Если вход представляет собой график с aa циклом, то вы достигнете точки в алгоритме, в котором вы не добавили все Узлы к выходу, но не имеете никаких дополнительных элементов в очереди (вы не можете добавить любой узел цикла в очередь из-за циклического отношения).
Т.е. проверьте returnList.size() == graph.nodeCount()
после цикла while (true
означает, что ациклический ввод, вход для false
средств имеет цикл).
graph.nodeCount()
должно быть числом узлов в графе в начале метода.
Вы можете использовать Tarjan SCC для поиска всех сильно связанных компонентов в ориентированном графе, если есть компонент размером> 1 (более одного узла в этом компоненте), поэтому в этом компоненте есть цикл.
Вы можете остановиться, как только алгоритм найдет сильно связанный компонент с размером больше 1.