[英]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.