【问题标题】:euler circuit using dfs in python在python中使用dfs的欧拉电路
【发布时间】:2014-05-12 02:10:22
【问题描述】:

我正在尝试编写一个程序来检查给定矩阵是否具有欧拉电路,我正在使用 DFS 进行检查,但我的递归调用存在一些问题。

第一次调用 DFSvisited 是 DFSvisited(G

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] 的 temp_path 而不是 [0,1,2,3,4,2,6,1,5,0]。

我想我在 DFSvisied 方法内的 DFSvisited 递归调用中遗漏了一些东西,有什么想法吗?

谢谢!

【问题讨论】:

    标签: python graph depth-first-search


    【解决方案1】:

    您的方法的问题在于 DFS 遍历的顺序不一定等同于欧拉路径。虽然您的 DFS 遍历最终将遍历所有边,但它可能需要回溯而不是采用一条连续路径。因此,您不必总是附加到临时路径的末尾,而是必须根据 DFS 回溯的距离插入临时路径。

    考虑以下示例图:

    如果 DFS 遍历以a -> b -> c -> a 开始,那么它将卡在a。因此,DFS 遍历必须回溯到具有未遍历边的最后一个顶点。这将是顶点b。然后可以使用b -> d -> e -> b 继续 DFS 遍历。此后,找不到未遍历的边,因此搜索结束。要构建欧拉路径,我们不能简单地按照访问顺序(即abcabdeb)连接顶点。相反,我们从构建临时路径abca 开始。然后,当我们在卡在a 后回溯到b 时,我们必须在临时路径中插入从b 访问的顶点。但不是在末尾插入,而是在b 之后插入它们,得到abdebca,这是一个有效的欧拉回路。

    要修复您的程序,您可以将参数 offset 添加到您的 DFSvisited 方法中。对于对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)
    

    【讨论】:

      猜你喜欢
      • 2018-10-21
      • 1970-01-01
      • 2017-08-27
      • 2022-08-10
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      • 2019-10-13
      • 1970-01-01
      相关资源
      最近更新 更多