繁体   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