我不确定为什么我的代码没有返回正确的路径顶点。它返回的是[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"));
}
}
答案 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>