双面BFS正确性

时间:2017-04-24 05:44:48

标签: graph-theory graph-algorithm breadth-first-search

与单端BFS相比,bi-directional搜索/两说BFS的查找时间更快。

双向搜索,如下工作

  

从两端执行传统BFS,并将受访节点保存在   他们各自的队列。如果一个节点很常见,则在两个队列之间,   我们可以得出结论,存在一条路径。

但是,我要求在下图中找到node1node2之间的路径,此算法会报告路径存在,1表示节点之间的距离,因为node3对两个队列都是通用的。

node1 -> node3 <- node2

然而,事实并非如此,结果不正确。双向搜索是否适用于有向图,或者是否需要对我的方法进行更改?

这是我的代码

public int searchDoubleEndedBfs( GraphNode node1, GraphNode node2 )
    {
        Queue<GraphNode> headQueue = new LinkedList<>();
        Set<GraphNode> visited = new HashSet<>();
        Queue<GraphNode> tailQueue = new LinkedList<>();
        Queue<GraphNode> childQueue = new LinkedList<>();
        int count = 0;

        headQueue.add(node1);
        visited.add(node1);
        tailQueue.add(node2);
        visited.add(node2);

        while(headQueue.size() > 0 && tailQueue.size() > 0)
        {
            if(headQueue.size() > tailQueue.size())
            {
                Queue<GraphNode> temp = new LinkedList<>();
                temp = headQueue;
                headQueue = tailQueue;
                tailQueue = temp;
            }

            GraphNode node = headQueue.poll();
            for(int i = 0;i<node.neighbors.size();i++)
            {
                GraphNode neighbor = node.neighbors.get(i);

                if(tailQueue.contains(neighbor))
                    return count+1;

                if(!visited.contains(neighbor))
                {
                    childQueue.add(neighbor);
                    visited.add(neighbor);
                }
            }

            headQueue.addAll(childQueue);
            childQueue.clear();
            count++;
        }

        return -1;
    }

1 个答案:

答案 0 :(得分:0)

从这一行开始:

GraphNode node = headQueue.poll();

您应该遍历headQueue中的所有节点,而不是仅仅从headQueue中轮询1个节点。基本上每个级别的所有节点都应该被拉出以便具有正确的级别计数。