BFS修改

时间:2014-04-10 16:28:03

标签: algorithm graph breadth-first-search

我试图找到所有最短路径,其中所有路径都具有值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
}

1 个答案:

答案 0 :(得分:0)

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

  1. 无限循环:如果从源到目标没有路径 - 但是图中有一个循环,您的算法应该返回0 - 但是,它会陷入无限而是循环。
  2. 计算错误的路径:假设target距离4的深度为source,并且路径为source->v1->v2->target。现在,假设您的图表中还有一个路径source->v3->v4->v5->target,并且由于某种原因v4target之前插入了队列(可能会发生这种情况,对其之间的排序没有限制)这些2)。您还可以将target再次添加到边(v5,target)的队列中,并计算路径source->v3->v4->v5->target,但这不是最短路径 - 但您确实计算了它... < / LI>

    以此图表为例: enter image description here

    在上面,您首先从s开始,并将其所有邻居添加到队列中。现在,我们假设在v2之前添加了v1(可能会发生这种情况,没有什么能阻止它......)
    现在,在下一步,v2将被展开,您将v3添加到队列中。
    接下来,处理v1并将target添加到队列中。
    现在,处理v3并再次将target添加到队列中。
    现在,处理targetcount增加,并设置标记found
    队列尚未清空,您现在处理target - 并再次增加count

    结果,完成后 - count == 2,但只有最短的路径。这是因为您还计算了路径s->v2->v3->t