gpt4 book ai didi

c++ - 使用 BFS 算法获取两个节点之间的最短路径

转载 作者:行者123 更新时间:2023-11-28 06:24:11 30 4
gpt4 key购买 nike

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

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

最佳答案

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

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

if neighbor->distance == max 

需要:

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

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

使用您的算法尝试找到从节点 A 到节点 B 的最短距离

  1. 运行 BFS(G,nodeA)
  2. 答案在nodeB->distance
  3. 您还可以通过 node->prev 返回找到最短路径,然后遍历图直到到达 nodeA

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

查找图中两个节点之间最短路径的最佳方法通常是使用 Dijkstra's Algorithm 来完成

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

关于c++ - 使用 BFS 算法获取两个节点之间的最短路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28802836/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com