【技术分享】图遍历算法之广度优先遍历算法

等风来也等你

共 1899字,需浏览 4分钟

 ·

2023-08-29 11:45

8e2b16bf981c90536aa8a2482d35ee16.webp

广度优先遍历算法应用的是队列这种数据结构的特点,它的遍历过程如下:

(1)以图中的任一顶点V为出发点,首先访问顶点V。

(2)访问顶点V的所有未被访问过的邻接点V 1 ,V 2 ,……,V n

(3)按照V 1 ,V 2 ,……,V n 的次序,访问每个顶点的所有未被访问过的邻接点。

(4)以此类推,直到图中所有和顶点V连通的顶点都被访问过为止。

这里以下图所示的无向图为例来介绍此方法的遍历过程。

b28f9b5601e2ad258aa93a689aa998fa.webp

步骤1 :假设以顶点A为起点,将顶点A放入队列,如下图所示。

1c786d33b8f7d740b06e03cc6006fc56.webp

步骤2 :取出顶点A,将顶点A的邻接点B和C放入队列,如下图所示。

ffa7bc00cb644b728a6114841c243d6b.webp

步骤3 :根据队列“先进先出”的原则,取出顶点B,将与顶点B相邻并且未被访问过的顶点D和顶点E放入队列,如下图所示。

07cbf23288ef46bd445474201139f54e.webp

步骤4 :取出顶点C,将与顶点C相邻并且未被访问过的顶点F放入队列,如下图所示。

2ba07dddec1642351651d4589741ba98.webp

步骤5 :取出顶点D,将与顶点D相邻并且未被访问过的顶点放入队列。由于顶点D的邻接点B和E都已被访问过,所以无需放入队列中,如下图所示。

b50253bff25b6912ad11d916ce212a7e.webp

步骤6 :取出顶点E,将与顶点E相邻并且未被访问过的顶点放入队列。由于顶点E的四个邻接点都已被访问过,所以无需放入队列中,如下图所示。

0e406a01a421837d5b8876592697f7e3.webp

步骤7 :取出顶点F,将与顶点F相邻并且未被访问过的顶点放入队列。由于顶点F的邻接点C和E都已被访问过,所以无需放入队列中,如下图所示。

a7e0e8a9c23c8e6f48397fe042d3b896.webp

此时,队列中的值都已被取出,表示图中的顶点都已被访问过。由此可知,本例中进行广度优先遍历的顺序为:顶点A、顶点B、顶点C、顶点D、顶点E、顶点F。

用Python代码描述上述过程,则算法代码如下:

def  bfs (graph, start):

    queue = [] 定义队列

     queue.append(start) 将起始顶点放入队列

     visited =  set () 定义集合

     visited.add(start) 将起始顶点放入已访问集合

     while  queue:

        vertex = queue.pop(0) 取出队列第一个元素

         print (vertex, end  ' ' ) 打印广度优先遍历的顶点

         for  in  graph[vertex] : 遍历相邻的顶点

             if  not in  visited: 如果该顶点未被访问过

                visited.add(w) 将该顶点放入已访问集合

                 queue.append(w) 把顶点放入队列


4575b24b5e70bbb5e06f1c2809df53b0.webp
浏览 21
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报