У меня работает алгоритм поиска в глубину:
public ArrayList<T> performDepthFirstSearchUndirectedNonWeighted(UndirectedNonWeightedGraph<T> graph, T startingVertex){
if (!graph.containsVertex(startingVertex)) {
throw new IllegalArgumentException("Vertex doesn't exist.");
}
T currentVertex = startingVertex;
ArrayList<T> traversalOrder = new ArrayList<T>();
ArrayList<T> visitedVertices = new ArrayList<T>();
Stack<T> stack = new Stack<T>();
visitedVertices.add(startingVertex);
stack.push(startingVertex);
while (stack.empty() == false) {
currentVertex = stack.peek();
stack.pop();
traversalOrder.add(currentVertex);
Iterable<Vertex<T>> neighboursIterable = graph.getNeighbours(currentVertex);
ArrayList<Vertex<T>> listOfNeighbours = new ArrayList<Vertex<T>>();
neighboursIterable.forEach(listOfNeighbours::add);
ArrayList<Vertex<T>> sortedListOfNeighbours = sortList(listOfNeighbours);
Collections.reverse(sortedListOfNeighbours);
for(Vertex<T> v :sortedListOfNeighbours) {
if (!visitedVertices.contains(graph.returnVertex(v.getElement()).getElement())) {
visitedVertices.add(v.getElement());
stack.push(v.getElement());
}
}
}
return traversalOrder;
}
У меня есть 2 типа переходов, которые я добавляю в последовательный переход.Первый переход - это переход заливки для изменения цвета вершин (круги в моем графическом интерфейсе), а второй переход - переход штриховки для изменения цвета ребер (линий в моем графическом интерфейсе).Последовательный переход будет содержать все переходы, и при воспроизведении будет показан первый обход графика поиска по глубине.
В моей программе последовательный переход называется «mainTransition». Я добавляю переход заполнения к последовательному переходу с помощью:
mainAnimation.getChildren().add(animations.fillVertexTransition(vertex.getElement().toString(),"Undirected Non Weighted"));
Я добавляю штриховой переход к последовательному переходу следующим образом:
mainAnimation.getChildren().add(animations.highlightEdgeTransition(vertexFrom.getElement().toString(),vertexTo.getElement().toString(), "Undirected Non Weighted"));
Моя проблема в том, что я не знаю, где в моем алгоритме поиска в глубину добавить переходы кмой последовательный переход.
Я успешно сделал это в алгоритме поиска в ширину, который можно увидеть ниже:
public ArrayList<T> performBreadthFirstSearchUndirectedNonWeighted(UndirectedNonWeightedGraph<T> graph, T startingVertex){
if (!graph.containsVertex(startingVertex)) {
throw new IllegalArgumentException("Vertex doesn't exist.");
}
T currentVertex;
ArrayList<T> traversalOrder = new ArrayList<T>();
ArrayList<T> visitedVertices = new ArrayList<T>();
LinkedList<T> queue = new LinkedList<T>();
visitedVertices.add(startingVertex);
queue.add(startingVertex);
mainAnimation.getChildren().add(animations.fillVertexTransition(
startingVertex.toString(),"Undirected Non Weighted"));
while (queue.size() != 0) {
currentVertex = queue.poll();
traversalOrder.add(currentVertex);
Iterable<Vertex<T>> neighboursIterable = graph.getNeighbours(currentVertex);
ArrayList<Vertex<T>> listOfNeighbours = new ArrayList<Vertex<T>>();
neighboursIterable.forEach(listOfNeighbours::add);
ArrayList<Vertex<T>> sortedListOfNeighbours = sortList(listOfNeighbours);
for(Vertex<T> v :sortedListOfNeighbours) {
if (!visitedVertices.contains(graph.returnVertex(v.getElement()).getElement())) {
visitedVertices.add(v.getElement());
queue.add(v.getElement());
mainAnimation.getChildren().add(animations.highlightEdgeTransition(currentVertex.toString(),
v.getElement().toString(), "Undirected Non Weighted"));
mainAnimation.getChildren().add(animations.fillVertexTransition(
v.getElement().toString(),"Undirected Non Weighted"));
}
}
}
return traversalOrder;
}
Я хочу что-то подобное для моего алгоритма поиска в глубину.
Любая помощь приветствуется!
Спасибо.
РЕДАКТИРОВАТЬ:
Мне удалось завершить это с помощью рекурсивной реализации поиска в глубину, который можно увидеть ниже:
public void performDepthFirstSearchUndirectedNonWeighted(UndirectedNonWeightedGraph<T> graph, T startingVertex,ArrayList<T> visitedVertices){
if (!graph.containsVertex(startingVertex)) {
throw new IllegalArgumentException("Vertex doesn't exist.");
}
visitedVertices.add(startingVertex);
Iterable<Vertex<T>> neighboursIterable = graph.getNeighbours(startingVertex);
ArrayList<Vertex<T>> listOfNeighbours = new ArrayList<Vertex<T>>();
neighboursIterable.forEach(listOfNeighbours::add);
ArrayList<Vertex<T>> sortedListOfNeighbours = sortList(listOfNeighbours);
mainAnimation.getChildren().add(animations.fillVertexTransition(
startingVertex.toString(),"Undirected Non Weighted"));
for(Vertex<T> v :sortedListOfNeighbours) {
if(!visitedVertices.contains(graph.returnVertex(v.getElement()).getElement())) {
mainAnimation.getChildren().add(animations.highlightEdgeTransition(startingVertex.toString(),
v.getElement().toString(), "Undirected Non Weighted"));
performDepthFirstSearchUndirectedNonWeighted(graph,v.getElement(),visitedVertices);
}
}
}