使用广度优先搜索:如何到达终点?

时间:2019-03-31 21:12:46

标签: java breadth-first-search

我不确定为什么我的代码没有返回正确的路径顶点。它返回的是[a b c]而不是[a c f],我不知道为什么。 我在这里有什么遗漏或算法做错了吗? 注意:getNeighbors(String vertex)返回其参数中顶点的连接边。

这是测试:我的代码在“ assertEquals(“ c”,route.next())”处停止,因为它返回的是“ b”而不是“ c”。我的代码的当前输出为[a b c],预期值为[a c f]

public class PathingTest {

    @Test
    public void testPathing(){
        Graph cycle = new Graph("graphs/cycle.json");
        Iterator<String> route = cycle.getRoute("d", "b").iterator();
        assertEquals("d",route.next());
        assertEquals("b",route.next());
        assertFalse(route.hasNext());

        Graph tree = new Graph("graphs/tree.json");
        route = tree.getRoute("a", "f").iterator();
        assertEquals("a",route.next());
        assertEquals("c", route.next());
        assertEquals("f", route.next());
        assertFalse(route.hasNext());

        Graph disconnected = new Graph("graphs/disconnected.json");
        assertEquals(null, disconnected.getRoute("a", "f"));
    }
}

1 个答案:

答案 0 :(得分:0)

queue变量和visited变量具有不同的用途,但就您而言,它们以相同的方式进行更新,这是不正确的。

很快,您在处理queue的父节点时将其添加到visited中(这意味着在将来的某个时刻,该节点也将被处理)。同时,只有在处理while(将其子级添加到队列)之后,才将节点添加到visited

您的while (!queue.isEmpty()) { String current = queue.remove(); path.add(current); visited.add(current); if (current == end) { return path; } Iterator<String> neighbors = getNeighbors(start).iterator(); while (neighbors.hasNext()) { String n = neighbors.next(); if (!visited.contains(n)) { queue.add(n); } } } 循环应如下所示(请注意插入<Query query={USER_QUERY} variables={{ user: userId }}> { ({ loading, error, data }) => { if (loading) return <p>Loading…</p> if (error) return <p>An Error Occurred</p> return ( <div> Data back from gql available! </div> )} } </Query> 的位置)。

<Query query={USER_QUERY} variables={{ user: userId }}>
  {
    ({ loading, error, data }) => {
    if (loading) return <p>Loading…</p>
    if (error) return <p>An Error Occurred</p>
    return (
      <MyContext.Provider value={data}>
        Data back from gql available!
      </MyContext.Provider>
    )}
  }
</Query>