在有向图中找到2个节点之间的路径?

时间:2017-01-23 02:50:53

标签: algorithm data-structures graph

我正在努力跟随一段代码,因为我尝试编写一个函数来查找两个节点之间是否存在路由:

我可以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类中,其中Adj​​acent()返回一个邻接列表。该程序有时可以工作,但在大多数情况下打印错误,即使在2个节点之间存在路由。

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;