图的遍历

1. 深度优先

  • 深度优先遍历的非递归算法

    def dfs_nonrec(graph, v0):
        vnum = graph.vertex_num()
        visited = [0]*vnum
        visited[v0] = 1
        st = []                               # 作为堆栈使用
        dfs_seq = []        
    
        st.append((0, graph.out_edges(v0)))
        while len(st) > 0:
            i, edges = st.pop()
            st.append((i+1, edges))
            v, e = edges[i]
            if not visited[v]:
                dfs_seq.append(v)
                visited[v] = 1
                st.append((0, graph.out_edges(v)))              

    堆栈中的元素形式为为 (i, edges),其中 edges 表示是某个顶点的出边表(比如 graph.out_edges(v0)),i 是目前访问的边表的下标,因为是深度优先,先访问 v0 的第一个出边,v0 的第一个出边能够达到的点全部遍历完毕之后,回过头来(回溯) v0 的第二个出边;

原文地址:https://www.cnblogs.com/mtcnn/p/9423996.html