使用BFS算法在两个节点之间获得最短路径

时间:2015-03-02 04:41:46

标签: c++ graph traversal breadth-first-search

我正在尝试通过节点图遍历广度优先搜索,之后我将尝试找到节点与另一节点之间的最短距离。这就是维基百科的BFS算法:

  procedure BFS(G,v) is
      let Q be a queue
      Q.push(v)
      label v as discovered
      while Q is not empty
         v ← Q.pop()
         for all edges from v to w in G.adjacentEdges(v) do
             if w is not labeled as discovered   
                 Q.push(w)
                label w as discovered

我有自己的Node类,节点的距离设置为max。我的版本基于第一个代码的样式:

class Node { // my version
  string name;
  vector<Node*> adj;
  int dist; // initially set to int max
  int prev;
  int index;
}

procedure BFS(G, Node* v)
    let Q be a queue
    v->distance = 0
    Q.push(v)
    label v as discovered
    while Q is not empty
      Node* n = q.front();
      v = Q.pop()
      for each node w adj vector of n
         Node* neighbor = G[w]
         if neighbor->distance == max
           neighbor->distance = n->distance + 1
           neighbor->prev = n->index
           q.push(neighbor)

我正在尝试使此代码也找到节点和另一个节点之间的最短路径。 e.g。

procedure BFS(G, Node* from, Node* to)

如何修改BFS代码来执行此操作?如果在这个循环中不可能,还有其他方法可以做到吗?

如果我的代码与我的要求有任何混淆,请通知我。谢谢!

1 个答案:

答案 0 :(得分:1)

通常,BFS算法只是为了以第一种方式走动图中的所有节点。与DFS(深度优先)算法相同,通常使用递归实现。

为了找到最短距离,您需要修改算法:

if neighbor->distance == max 

需要:

if neighbor->distance > n->distance+1

虽然这会产生完全相同的算法。但如果图形的边缘的距离不是1,那么这是必需的。

使用您的算法尝试查找从nodeA到nodeB的最短距离

  1. 运行BFS(G,nodeA)
  2. 答案在nodeB-&gt;距离
  3. 你也可以通过节点 - >上一步然后在图表上走回来找到最短的路径,直到你到达nodeA
  4. 如果所有边距都为1,则可以在第一次找到nodeB时停止算法。但是,如果边缘的距离可变,则需要运行BFS算法才能完成。

    通常使用Dijkstra's Algorithm

    来查找图表中2个节点之间最短路径的最佳方法

    它与呼吸优先搜索有一些相似之处,但由于优先级队列的使用而更快。