DFS,访问时间为整数

时间:2014-02-01 01:03:24

标签: python graph

我在python中实现了递归DFS,我想记录节点的探索时间。例如

对于这样的图表:

enter image description here

idx = 1
def dfs(root, idx):
   if graph[root][1] == 0:
      graph[root][1] = 1
      children = graph[root][0]
      if len(children) == 0:
        graph[root][2] = idx
        return -1
      for val in children:
        if graph[val][1] == 0:
            idx += 1
            if dfs(val, idx) == -1:
                idx += 1
                continue

      graph[root][2] = idx

dfs(1, idx)
print graphs

图表表示为:

graph = {
    1: [[2, 3], 0, 0],
    2: [[4, 5, 6], 0, 0],
    3: [[4,6], 0, 0],
    4: [[5,6], 0, 0],
    5: [[6], 0, 0],
    6: [[], 0, 0]
}

dict项的值中的第一项是children,第二项是标记,第三项是标记完成时的索引。

我得到的输出不正确。

{1: [[2, 3], 1, 3], 2: [[4, 5, 6], 1, 3], 3: [[4, 6], 1, 3], 4: [[5, 6], 1, 4], 5: [[6], 1, 6], 6: [[], 1, 5]}

第5和第6次探索正确

不是作业问题。我正在练习实现。 正确的输出是: 节点:IDX 1:10,2:8,3:9,4:7,5:6,6:5

数字含义的解释:

你用idx = 1启动dfs,你可以想到在idx = 1时开始探索节点1。

然后我们访问Node2(idx = 2),Node4 -idx = 3,节点5-idx = 4,然后节点6-idx = 5. 6的发现时间是5,无法进一步探索,因此6的时间是5我们回到节点5,它的发现时间是4,但现在节点4的结束时间是6. 7,Node et.all的结束时间是8

1 个答案:

答案 0 :(得分:0)

当递归调用返回时,您不知道它探索了多少个节点。如果代码在递归调用后发现了一个叶子节点,那么代码中有一行会将idx递增1,但对于非叶子情况则没有。您需要在函数调用之间跟踪计数,可能通过返回idx作为第二个返回值并相应地更新调用者的值。

请注意,在一个函数调用中对idx的赋值对其他调用所看到的值没有影响。 idx函数中的dfs是局部变量,赋值只会将新值绑定到变量的本地副本。