我正在努力跟随一段代码,因为我尝试编写一个函数来查找两个节点之间是否存在路由:
我可以isThereRoute
运作的主要地方。
ArrayList<Node> visited = new ArrayList();
visted.add(start_node);
System.out.println(isThereRoute(start_node, end_node, visited));
以下是功能
bool isThereRoute(Node A, Node B, ArrayList<Node> visited){
flag = false;
if(A == B) return true;
for(Node n : A.adjacent()){
if (!visited.contains(n)) {
visited.add(n);
flag = isThereRoute(n, B, visited);
}
}
return flag;
}
所有节点都在Graph类中,其中Adjacent()返回一个邻接列表。该程序有时可以工作,但在大多数情况下打印错误,即使在2个节点之间存在路由。
答案 0 :(得分:0)
如果有路线,或者当flag为真时,你需要打破循环。
bool isThereRoute(Node A, Node B, ArrayList<Node> visited){
flag = false;
if(A == B) return true;
for(Node n : A.adjacent()){
if (!visited.contains(n)) {
visited.add(n);
flag = isThereRoute(n, B, visited);
}
if (flag == true) break; //<====insert here
}
return flag;
}
如果不中断循环,则在任何后续迭代中,flag可能会更改为false。
答案 1 :(得分:0)
您的行flag = isThereRoute(n, B)
将表示该标志设置为检查的最后一个节点。这没有任何意义 - 它应该在找到路径后立即停止:
if (A == B)
return true;
for (Node n: n.adjacent()) {
if (!visited.contains(n)) {
visited.add(n);
if (isThereRoute(n, B, visited))
return true;
}
}
return false;