Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 如何使用广度优先搜索获得两个节点之间的路径?_Search_Graph_Path_Breadth First Search - Fatal编程技术网

Search 如何使用广度优先搜索获得两个节点之间的路径?

Search 如何使用广度优先搜索获得两个节点之间的路径?,search,graph,path,breadth-first-search,Search,Graph,Path,Breadth First Search,我试图在图中的两个节点之间找到一条路径,其中边是未加权的 我使用的是广度优先搜索,它在找到目标时停止,以便找到路径的存在,但我不确定如何获得路径本身 我试图查看已访问节点的列表,但这似乎没有帮助。 我看到有人用Prolog回答这个问题,但我是C++程序员。 我还研究了Dijkstras算法,但这似乎有些过头了,因为一个简单的广度优先搜索几乎解决了所有问题 如何使用广度优先搜索获取两个节点之间的路径?在节点结构中,添加一个名为parentNode的变量,该变量是路径中该节点的父节点。最后,您可以通

我试图在图中的两个节点之间找到一条路径,其中边是未加权的

我使用的是广度优先搜索,它在找到目标时停止,以便找到路径的存在,但我不确定如何获得路径本身

我试图查看已访问节点的列表,但这似乎没有帮助。 我看到有人用Prolog回答这个问题,但我是C++程序员。 我还研究了Dijkstras算法,但这似乎有些过头了,因为一个简单的广度优先搜索几乎解决了所有问题


如何使用广度优先搜索获取两个节点之间的路径?

在节点结构中,添加一个名为
parentNode
的变量,该变量是路径中该节点的父节点。最后,您可以通过从目标节点向后遍历来检索路径。

我发现了一个简单的算法,它将节点的路径与队列中的节点一起存储在这里: 因此,当我们从队列中弹出一个节点时,我们也可以很容易地获得该节点的路径

链接中的代码是用python编写的,它使用元组来存储这一对。这里是一个C++实现,它使用STD::对。
bool findPath(节点*n1、节点*n2、向量和路径)
{
//我们使用队列执行BFS遍历,除了存储
//节点我们还将存储到节点的路径。
队列q;
//访问第一个节点并将其添加到队列中。
n1->访问量=1;
//形成路径,创建一对并将其添加到队列中。
向量p;
p、 推回(n1);
q、 推送(使配对(n1,p));
而(!q.empty())
{
成对电流对=q.前();
q、 pop();
//访问所有未访问的节点并检查其中是否有n2。
对于(节点*u:curPair.first->adjNodes){
如果(u->访问==0){
如果(u->value==n2->value){
//找到我们的目的地。返回true
//通过将此节点附加到路径中形成路径,直到现在
宵禁。第二。推回(u);
//使用到目前为止的路径更新传递的“路径”向量。
path=curPair.second;//所有节点都将复制到path中
返回true;
}
//不是我们的节点,如果未访问,请访问该节点
如果(u->访问==0){
u->visted=1;
//创建添加此节点的新路径。
//到目前为止的路径可以从队列中的对中获得
向量新路径(curPair.second);
新路径。推回(u);
//将节点及其路径添加到队列中。
q、 推送(使配对(u,新路径));
}
}
}
}
返回false;
}
类节点{
公众:
节点(int-val)
{ 
值=val;
访问量=0;
}
int值;
向量节点;
国际访问;
};

我认为这种方法适用于树,但不适用于一个节点可能有多个父节点的图。在这种情况下,我们可能需要在构建路径时维护一个列表。@RichAshworth如果您只关心最短路径,如果只存储遇到的第一个父节点就足够了,因为这将是到达当前节点的最快方法,即使您可以通过其他父节点到达当前节点?如果不必求助于新的vars呢?