未加权双向图上的广度优先搜索

时间:2018-10-13 12:11:57

标签: python python-3.x data-structures graph-theory breadth-first-search

我一直在尝试使用BFS查找2个节点之间的最短路径。我尝试查看教程和在线阅读资料,但对我来说,这些内容都不是很清楚。我目前只能遍历该图,但是我不确定是否需要进行哪些检查才能找到图中两个节点之间的最小路径。该图是未加权的并且是双向的。 这是我的代码,使用BFS遍历图中的所有节点。

def bredthfirstsearch(start, end, graph):
    queue = [start]
    visited = [False]*(roads+1) #marks if a node has been visited
    visited[start] = True
    while len(queue) != 0:
        # source node popped and later used to find neighboring nodes
        node = queue.pop(0)

        for item in graph[node]:
            # if the node has not been found previously
            if visited[item[0]] == False:
                queue.append(item[0]) # it is added to the queue for future checking on its neighbors 
                visited[item[0]] = True #node then set to true

现在我可能需要一个额外的数组来存储最短路径,但是我不确定该怎么做。非常感谢。

1 个答案:

答案 0 :(得分:0)

BFS将帮助您从 特定节点 查找所有最短路径。如果要使用BFS在图中的每对节点之间找到最小路径,则需要从几乎每个节点(几乎每个节点,因为已经计算了一些叶子)运行BFS。 / p>

这里是如何找到两个节点之间的距离。 在顶点a(任意顶点)上使用BFS,您将能够找到到其他顶点的所有最短路径(距离)。 要计算距离,您将需要一个“液位计”。 这是伪代码,可以帮助您做到这一点:

q = new Queue()
dist_array = new Array(N) //and Set each value to infinity
distance=0
q.enqueue(a) //a is the selected node
dist_array[a] = 0
while q not empty:
    v = q.dequeue()
    ++distance
    for each neighbor x of v:
        if distance_array[x] < infinity:
             continue
        d[x] = distance
        q.enqueue(x)

在以下情况下,让您说您的图形为G =(V,E):

  • V = {a,b,c,d,e,f},| V | = N = 6
  • E = {(a,b),(a,c),(a,e),(b,d),(b,e),(d,f)},| E | = M = 6

如果我们在图形上运行此代码,我们将得到以下结果

dist=1: a->b, a->c, a->e
dist=2: a->d
dist=3: a->f