图的非递归深度优先遍历算法的python实现

采用深度优先遍历方式处理一个图,也就是按照深度优先搜索(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实现可以参看我的上一篇博文,这里直接使用上篇博文中定义的图类。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值