【问题标题】:Getting shortest path between two nodes with BFS algorithm使用 BFS 算法获取两个节点之间的最短路径
【发布时间】:2015-03-02 04:41:46
【问题描述】:

我正在尝试通过节点图进行广度优先搜索遍历,之后我将尝试找到一个节点与另一个节点之间的最短距离。这是维基百科的 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

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

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)

我试图让这段代码也能找到一个节点和另一个节点之间的最短路径。例如

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

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

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

【问题讨论】:

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


    【解决方案1】:

    通常BFS算法只是为了以呼吸优先的方式遍历图中的所有节点。与通常使用递归实现的 DFS(深度优先)算法相对。

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

    if neighbor->distance == max 
    

    需要:

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

    虽然这将导致完全相同的算法。但如果图的边的距离不是 1,那么这是必需的。

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

    1. 运行 BFS(G,nodeA)
    2. 答案在nodeB->距离
    3. 您还可以通过 node->prev 往回走,然后在图表上,直到到达 nodeA 来找到最短路径

    如果所有边的距离都为 1,您可以在第一次找到 nodeB 时停止算法。但是,如果您的边缘距离可变,则需要运行 BFS 算法才能完成。

    在图中找到 2 个节点之间的最短路径的最佳方法通常是使用 Dijkstra's Algorithm

    它与呼吸优先搜索有一些相似之处,但由于使用了优先级队列,所以速度更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 2023-01-15
      • 2019-04-20
      相关资源
      最近更新 更多