Algorithm BFS改性

Algorithm BFS改性,algorithm,graph,breadth-first-search,Algorithm,Graph,Breadth First Search,我试图找到所有最短路径,其中所有路径的值为1。 我用了改良的BFS。我也在向队列中添加封闭节点。当我找到结束节点时,我停止添加节点,只计算队列中的结束节点。但它对我的测试输入不起作用。为什么我的主意不好 伪码 addIntoQueue(startNode) while(!queueIsEmpty()){ nodeMain = dequeue() if(nodeMain==stopNode){ found=true count++ } if(!fou

我试图找到所有最短路径,其中所有路径的值为1。 我用了改良的BFS。我也在向队列中添加封闭节点。当我找到结束节点时,我停止添加节点,只计算队列中的结束节点。但它对我的测试输入不起作用。为什么我的主意不好

伪码

addIntoQueue(startNode)
while(!queueIsEmpty()){
   nodeMain = dequeue()
   if(nodeMain==stopNode){
      found=true
      count++
   }
   if(!found)
   for(all node in NodeNeighbors){
      if(node!=CLOSED){
         addToQueue(node)
      }
   }
   nodeMain=CLOSED
}

以下是代码中的一些问题:

无限循环:如果没有从源到目标的路径,但是图中有一个循环,那么您的算法应该返回0,但是,它被卡在无限循环中。 计算错误路径:假设目标位于距离源的深度4处,并且通过路径source->v1->v2->target到达。现在,假设图形中还有一个路径source->v3->v4->v5->target,并且由于某种原因,v4在目标发生之前就被插入到队列中,这两个路径之间的顺序没有限制。您还可以将目标再次添加到边缘v5、目标的队列中,并计算路径source->v3->v4->v5->target,但这不是最短路径-但您确实计算了它。。。 查看此图表,例如:

在上面的示例中,首先从s开始,并将其所有邻居添加到队列中。现在,假设v2是在v1之前添加的,没有什么可以阻止它。。 现在,在下一步,v2将被展开,您将把v3添加到队列中。 接下来,处理v1并将目标添加到队列中。 现在,v3已被处理,并再次将目标添加到队列中。 现在,处理目标,增加计数,并设置找到的标志。 队列尚未为空,您现在可以处理目标并再次增加计数


因此,当完成时-count==2,但只有1条最短路径。这是因为您还计算了路径s->v2->v3->t.

count++在做什么?您没有在代码中的任何其他地方使用该变量。此外,您可能需要考虑尽早退出循环,因为在找到停止节点之后,没有更多的节点被添加到队列中。我想计算所有最短的方法。所以count正在计算,我不能发布代码。我来只是想问一下在队列中添加开放节点的想法@Al-Kepppath可以重叠。我不明白你的代码是怎么解释的。一个方向上可能只有一条路径。1我的图表是连贯的。2如果有路径source->v4->v5->target和source->v1->v2->target,我应该计算两条路径。@SpeedEX505示例中的一条路径长度为4,另一条路径长度为5。应该只计算第一个-您可以同时计算两个。我有问题,我计算的路径比实际的路径多。当没有插入所有深度的节点时,YBFS无法插入到队列深度+1中。我不明白你的意思exmaple@SpeedEX505看编辑,我解释得更详细了。问题是,这种行为会使您计算一些长度为d+1的路径,其中d是最短路径长度。