我有一个图表,我想找到两个节点之间的所有最短路径。我在BFS找到了两个节点之间的最短路径。但是,它只是给我一条最短路径,如果存在一条以上。
我如何使用BFS获取所有这些?
我从众所周知的BFS伪代码实现我的代码 此外,我有一个邻接列表向量,它包含所有节点的邻接顶点。
答案 0 :(得分:9)
您可以通过维护每个节点的父级列表或向量来轻松完成此操作。 如果距起始节点相同距离的两个或多个节点(比如X,Y,Z)通向另一个节点M,则将所有X,Y和Z作为M的父节点。
您只需添加一个检查,以便在向节点添加父级时查看该父级是否与之前的父级处于同一级别。
按级别,我的意思是距离起点的距离。
这样,您可以通过追溯父矢量来获取所有最短路径。 下面是我的C ++实现。
我希望您知道如何通过从目的地开始,跟踪父母并到达起点来打印路径。
编辑:伪代码
bfs (start , end)
enqueue(start)
visited[start] = 1
while queue is NOT empty
currentNode = queue.front()
dequeue()
if(currentNode == end)
break
for each node adjacent to currentNode
if node is unvisited
visited[node] = visited[curr] + 1
enqueue(node)
parent[node].add(currentNode)
else if(currentNode is in same level as node's parents)
parent[node].add(currentNode)
return
答案 1 :(得分:1)
更简单的方法是使用dfs查找从源到目标的所有路径。现在找到这些路径中的最短路径。这是一个sudo代码:
dfs(p,len)
if(visited[p])
return
if(p== destination)
paths.append(len)
return
visited[p]=1
for each w adjacent to p
dfs(w,len+1)
visited[p]=0
您可以通过维护路径数组来找到路径。我将把它作为作业留给你
答案 2 :(得分:1)
如果图表很大,从头到尾查找所有路径然后选择最短路径可能效率很低。这是一个更好的算法:
使用BFS,标记每个节点与起始节点的距离。到达终点节点时停止。
def bfs_label(start, end):
depth = {start: 0}
nodes = [start]
while nodes:
next_nodes = []
for node in nodes:
if node == end:
return depth
for neighbor in neighbors(node):
if neighbor not in depth:
depth[neighbor] = depth[node] + 1
fringe.append(neighbor)
使用DFS,查找从起始节点到结束节点的所有路径,以使路径的每个步骤的深度严格增加。
def shortest_paths(node, end, depth, path=None):
if path is None:
path = []
path.append(node)
if node == end:
yield tuple(path)
else:
for neighbor in neighbors(node):
if neighbor in depth and depth[neighbor] == depth[node]+1:
for sp in shortest_paths(neighbor, end, depth, path):
yield sp
path.pop()
答案 3 :(得分:0)
我们可以使用简单的BFS算法查找所有最短路径。我们可以与当前节点一起维护路径。我在下面提供了指向python代码的链接。 https://gist.github.com/mridul111998/c24fbdb46492b57f7f17decd8802eac2