前面的文章中我们学习了图的基本概念和存储结构,大家可以通过下面的链接学习:
这篇文章就来学习一下图的重要章节——图的遍历。
目录
一,图的遍历定义:
从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。
图遍历的实质:找每个顶点的邻接点的过程。
要进行图的遍历,我们需要知道图的特点,从而用合适,高效的方法来实现遍历。
图有哪些特点?
图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。
那么,如何避免在遍历时重复访问?
解决思路:
设置辅助数组 visited [n ],用来标记每个被访问过的顶点。
初始状态为0
被访问,改 visited [i]为1,防止被多次访问。
图常用的遍历有两种:
深度优先搜索(Depth First Search,DFS)
广度优先搜索(Breadth First Search,BFS)
二,深度优先搜索(DFS)
引例:
点亮迷宫中所有的灯,我们会一条道走到头,如果走不动了,再往回退寻找其他没有走过的。
因此我们可以总结DFS的详细归纳:
在访问图中某一起始顶点
v
后,由
v
出发,访问
它的任一邻接顶点
w
1
;
再从
w
1
出发DFS
邻接
但还
未被访问
过的顶点
w
2
;
然后再从
w
2
出发,进行类似的访问,
…
如此进行下去,直至到达所有的邻接顶点都被访问过的顶点
u
为止。
接着,退回一步,
退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。
如果有,
则访问此顶点,之后再从此顶点出发,进行与前述类似的访问。
如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。