采用深度优先遍历方式处理一个图,也就是按照深度优先搜索(Depth-FirstSearch)的方式实施整个遍历过程。假定从指定顶点v出发,深度优先遍历的做法是:
- 首先访问顶点并将其标记为已访问。
- 检查v的邻接顶点,从中选一个尚未访问的顶点,从它出发继续进行深度优先搜索(这是递归)。不存在这种邻接顶点时回溯(邻接顶点可能排了一种顺序)。
- 反复上述操作直到从v出发可达的所有顶点都已访问(递归)。
- 如果图中还存在未访问的顶点,则选出一个未访问顶点,由它出发重复前述过程,直到图中所有顶点都已访问为止。
通过深度优先遍历顺序得到的顶点序列称为该图的深度优先搜索序列(Depth-FirstSearch序列),简称为DFS序列。显然,对图中任一顶点的邻接点采用不同的访问顺序,就可能得到不同的DFS序列(因此,DFS序列不唯一),如果规定了图中各顶点的邻接点顺序,也就确定了DFS序列。
采用非递归方法实现深度优先遍历,要使用栈作为辅助的数据结构,代码如下:
def DFS_graph(graph,v0):
vnum=graph.vertex_num()
visited=[0]*vnum #visited记录已访问顶点
visited[v0]=1
DFS_seq=[v0] #DFS_seq记录遍历序列
st=SStack
st.push((0,graph.out_edges(v0))) #入栈(i,edges)说明下次应访问边edges[i]
while not st.is_empty():
i,edges=st.pop()
if i<len(edges):
v,e=edges[i]
st.push((i+1,edges))
if not visited[v]: #v未访问,访问并记录其可达顶点
DFS_seq.append(v)
visited[v]=1
st.push((0,graph.out_edges(v)))
return DFS_seq
该函数接收一个图和一个遍历起始点,返回一个DFS序列。关于图类的python实现可以参看我的上一篇博文,这里直接使用上篇博文中定义的图类。