对于一个无权图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