实现广度优先图遍历一个给定的深度
我想实现广度优先图遍历,返回从一个节点到另一个路径的数量,但只能通过给定数量的节点。实现广度优先图遍历一个给定的深度
例如给出一个节点A,B,C,D,E的列表,如果我想知道从A到D获得的不同路径的数量,但是只有当路径不超过2个停止。 A-B-D,A-E-D将被认为是可以接受的,但是A-B-E-D会停止太多次,所以答案将是2条路径。
我想实现这个算法,但我不知道如何跟踪深度,以便我的搜索只有n层深。
这是我写的代码,迄今为止。问题在于searchNumPaths()方法。
public class PathSearch{ private int maxSearches;
private int pathCount;
private int numPaths;
private String node;
private ArrayList<ArrayList<String>> path;
ArrayList<Node> visited;
public PathSearch(int maxSearches, int pathCount) {
node = "";
this.maxSearches = maxSearches;
this.pathCount = pathCount;
path = new ArrayList<ArrayList<String>>();
visited = new ArrayList<Node>();
}
public int searchNumPaths(HashMap<String, Node> graph, Node startLocation, String endLocation, Queue<String> queue) {
//queue.add(startLocation.getLocation());
while(!queue.isEmpty()) {
node = queue.remove();
System.out.println("\n" + node +"\n");
for (Edge realPath: graph.get(node).getNeighbors()) {
node = realPath.getEndLocation();
System.out.println(node);
queue.add(node);
if (node.equals(endLocation)) {
numPaths++;
}
}
pathCount++;
if (pathCount>6){
break;
}
for (int i = 0; i<queue.size(); i++) {
searchNumPaths(graph, graph.get(queue.peek()), endLocation, queue);
queue.remove();
}
}
return numPaths;
}
public static void main(String[] args) throws IOException {
Train train = new Train();
Graph graph = new Graph(train.readFile("input.txt"));
LinkedList<String> queue = new LinkedList<String>();
queue.add("A");
PathSearch great = new PathSearch(10, 0);
HashMap<String, Node> map = graph.returnMap();
Node node = graph.returnMap().get("A");
String nodeTwo = graph.returnMap().get("C").getLocation();
//System.out.println(queue.remove());
System.out.println("Number of paths: " + great.searchNumPaths(map, node, nodeTwo, queue));
}
}
回答:
您可以创建一个QueueNode
类,它包含在您的队列放在一起有一个数字,表示该节点的深度当前字符串。然后,您可以继续搜索,直到遇到深度过大的节点。像这样的东西(T
是在你的情况下,String
):
public class QueueNode<T> { T value;
int depth;
public QueueNode(T value, int depth) {
this.value = value;
this.depth = depth;
}
// And so on.. Getters etc.
}
当您创建新的对象QueueNode
,只需将深入到一个比当前节点的深度。
通过这样做,你可以添加这样的事情你searchNumPaths
函数(调用queue.remove()
后):
if (node.getDepth() > maxDepth) { return numPaths;
}
请注意,如果这仅适用于您的队列保证随深度增加而返回的节点。对于广度优先的搜索来说,情况总是如此,但如果您打算将其更改为A星搜索或稍后进行搜索,则此假设会中断。
以上是 实现广度优先图遍历一个给定的深度 的全部内容, 来源链接: utcz.com/qa/261100.html