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