图的广度优先遍历

对于一个无权图G=(V,E),我们采用邻接表表示:

0:1、2、5、6
1:0
2:0
3:4、5
4:3、5、6
5:0、3、4
6:0、4

对于这个图,如何广度遍历呢?

我们使用队列queue这个数据结构。

首先,确定一个起点s(源),接下来对这个点进行操作:push进队列;同时被访问过visited[s] = true

queue:1

然后,将 1 这个点pop出来,同时对 1 的邻接点i遍历,判断没有没访问,将 i 点push进queue,这些邻接点i都设置为被访问过,visited[i] = true

queue:0

重复第二步,将pop(0),foreach(0的邻接点集),判断没有被访问过的点,push,visited[..] = true

queue:2 5 6

直至queue中元素个数为0。

至此完成了对图G的广度遍历。

值得注意的地方:

1、广度遍历也是层序遍历,如果将图拉扯为一棵数的话,那么始终是按照一层一层的顺序遍历,也因此可以找到最短路径

2、对于每个节点何时置其为被访问过

    如果在pop出队列后,算被访问过,那么队列就会出现重复元素,但是不会影响最终结果,queue先后出现:102563444

    如果在push进队列后,算被访问过,那么队列不会出现重复元素,queue先后出现:1025634

点赞