当前位置: 首页 > 知识库问答 >
问题:

用BFS算法求两节点间的最短路径

赖浩荡
2023-03-14

我试图通过一个节点图进行广度优先搜索遍历,然后我将尝试找到一个节点和另一个节点之间的最短距离。这就是维基百科的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代码来实现这一点?如果在这个循环中是不可能的,那么还有什么其他的方法呢?

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

共有1个答案

赵英资
2023-03-14

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

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

if neighbor->distance == max 

需要:

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

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

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

  1. 运行BFS(G、nodeA)
  2. 答案在nodeB中-

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

寻找图中两个节点之间最短路径的最佳方法通常是使用Dijkstra算法

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

 类似资料:
  • 我需要帮助在一个未加权无向图中找到两个节点之间的所有最短路径。 我能够使用BFS找到一条最短路径,但到目前为止,我还不知道如何找到并打印出所有路径。 知道我可以使用的算法/伪代码吗?

  • Dijkstra算法说 对于图中给定的源节点,算法找到该节点和其他节点之间的最短路径 我得到了算法来找到那个节点和其他节点之间的最短路径。但是我的问题是,如果我需要为Linkedin/facebook这样的大图找到两个特定节点(比如N1和N2)的最短路径,我需要计算该节点N1和领英上其他节点(用户,意味着十亿用户)之间的距离吗首先,将其存储在高速缓存中,然后在询问两个节点的最短距离时从高速缓存中返

  • 我正在寻找最有效的算法,根据大O符号,在未加权有向图中找到两个节点之间的最短路径。 我主要分为带堆的Dijkstra和呼吸优先搜索,如果图加权,我通常会使用堆。 在这种情况下,未加权的图是否会使Dijkstra的使用效率低于BFS?

  • 主要内容:最短路径算法在给定的图存储结构中,从某一顶点到另一个顶点所经过的多条边称为 路径。 图 1 图存储结构 例如在图 1 所示的图结构中,从顶点 A 到 B 的路径有多条,包括 A-B、A-C-B 和 A-D-B。当我们给图中的每条边赋予相应的权值后,就可以从众多路径中找出总权值最小的一条,这条路径就称为 最短路径。 图 2 无向带权图 以图 2 为例,从顶点 A 到 B 的路径有 3 条,它们各自的总权值是:

  • 我想写一个算法,在有向图和无向图中找到两个特定顶点(源和目标)之间的最短路径。 我知道dijkstra算法,该算法用于寻找所有最短路径图。但是你会修改这个算法,只找到两个顶点之间的最短路径吗?