簡體   English   中英

在python中使用dfs的歐拉電路

[英]euler circuit using dfs in python

我正在嘗試編寫一個程序來檢查給定的矩陣是否具有歐拉電路,我正在使用 DFS 進行檢查,但是我的遞歸調用存在一些問題。

DFSvisited 的第一個調用是 DFSvisited(G<- 如下所示 , 0, 1, temp_path =0)

def DFSvisited(G,i,j,temp_path):
    G[i][j]=0
    G[j][i]=0
    temp_path.append(j)
    for k in range(0,n):
        if G[j][k]==1:
            print 'j+++',j,"#### k",k
            DFSvisited(G,j,k,temp_path)

我傳遞了一個看起來像這樣的矩陣:

   0   1   0   0   0   1   0
   1   0   1   0   0   1   1
   0   1   0   1   1   0   1
   0   0   1   0   1   0   0
   0   0   1   1   0   1   1
   1   1   0   0   1   0   1
   0   1   1   0   1   1   0

但它返回[0, 1, 2, 3, 4, 5, 6, 6, 4, 6, 5, 6]而不是 [0,1,2,3,4,2,6,1, 5,0] 在它的第一次迭代中。

我想我在 DFSvisied 方法中的 DFSvisited 遞歸調用中遺漏了一些東西,有什么想法嗎?

謝謝!

你的方法的問題是 DFS 遍歷的順序不一定等同於歐拉路徑。 雖然您的 DFS 遍歷最終會遍歷所有邊,但它可能需要回溯而不是采用一條連續路徑。 因此,您不必總是附加到臨時路徑的末尾,而是必須根據 DFS 回溯的距離插入臨時路徑。

考慮以下示例圖:

在此處輸入圖片說明

如果 DFS 遍歷從a -> b -> c -> a ,那么它會卡在a 因此,DFS 遍歷必須回溯到具有未遍歷邊的最后一個頂點。 這將是頂點b DFS 遍歷然后可以繼續b -> d -> e -> b 此后,找不到未遍歷的邊,因此搜索結束。 為了構造歐拉路徑,我們不能簡單地按照訪問順序(即abcabdeb )連接頂點。 相反,我們從構建臨時路徑abca 然后,當我們回溯到b陷在后a我們必須插入來自走訪了頂點b在臨時路徑。 但是不是在最后插入,我們必須在b之后插入它們,從而產生abdebca ,這是一個有效的歐拉回路。

要修復您的程序,您可以向DFSvisited方法添加一個參數offset 對於DFSvisited的初始調用,偏移量將設置為0 對於每個遞歸調用,偏移量設置為offset+1 然后可以通過在給定offset處插入臨時路徑來替換臨時路徑的附加:

def DFSvisited(G,i,j,offset,temp_path):
    G[i][j]=0
    G[j][i]=0
    n = len(G)
    temp_path.insert(offset, j)
    for k in range(0,n):
        if G[j][k]==1:
            DFSvisited(G,j,k,offset+1,temp_path)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM