Я использую поиск в глубину по ненаправленному графику, чтобы найти пути от начального узла до конечного узла.Все узлы вдоль пути хранятся в ArrayList.Но поскольку может быть несколько путей, идущих от начала до конца, я решил сохранить каждый из ArrayLists, которые содержат узлы вдоль путей к другому ArrayList, поэтому второй ArrayList должен содержать все решения ArrayLists.
ОднакоКогда я тестировал код, он всегда заканчивался тем, что ArrayLists по какой-то причине были пустыми, и я не уверен, когда это так.Это мой код для обхода DFS:
private void pathDepthFirstSearch(Graph graph, GraphNode u, GraphNode v) throws GraphException {
listOfNodes.add(u); //Adds the starting node to the ArrayList
u.setMark(true); //Marks it as visited.
if(u.getName() == v.getName()) { //Managed to get to the end node.(.getName() returns int values).
listOfSolutions.add(listOfNodes); //Add this Path solution to the ArrayList that contains a list of solutions.
numOfSolutions++; //Number of solutions increment by 1.
} else {
for (Iterator<GraphEdge> iter = graph.incidentEdges(u); iter.hasNext();) {
GraphEdge nextEdge = iter.next();
GraphNode secondEndPoint = nextEdge.secondEndpoint();
if(secondEndPoint.getMark() == false) { //Checks if the end point of the edge has been visited or not, if not, then call the method recursively.
pathDepthFirstSearch(graph,secondEndPoint, v);
}
}
}
listOfNodes.remove(u); //Finished exploring u, so remove it from the Solution ArrayList.
u.setMark(false); //Mark as un-visited.
}
И код для вызова функции с указанными startNode и endNode:
private List<GraphNode> listOfNodes = new ArrayList<GraphNode>(); //The ArrayList to store one path solution.
private List<List<GraphNode>> listOfSolutions = new ArrayList<>(); //The ArrayList to store all the ArrayList path solutions.
public Iterator<GraphNode> solve() throws GraphException {
GraphNode startNode = new GraphNode(startLoc); //Creates the starting node.
GraphNode endNode = new GraphNode(endLoc); //Creates the end node.
pathDepthFirstSearch(graph, startNode, endNode);
//returns one of the solutions from the ArrayList of solutions (listOfSolutions)
//depending on if we want the longest or shortest path. If the list is empty,
//then null is returned instead.
}
После запуска этого в моей основной функции, которая печатаетузлы из ArrayList, который возвращается из метода solve (), я получаю сообщение «решение не найдено», которое я устанавливаю так, чтобы оно происходило только тогда, когда метод возвратил нуль.
Почему ArrayListпустой, хотя в методе DFS к нему должны были быть добавлены узлы, а затем список добавлен в listOfSolutions?