1. 程式人生 > >圖的非遞迴深度優先遍歷演算法的python實現

圖的非遞迴深度優先遍歷演算法的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實現可以參看我的上一篇博文,這裡直接使用上篇博文中定義的圖類。