我在python中实现了递归DFS,我想记录节点的探索时间。例如
对于这样的图表:
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
答案 0 :(得分:0)
当递归调用返回时,您不知道它探索了多少个节点。如果代码在递归调用后发现了一个叶子节点,那么代码中有一行会将idx
递增1,但对于非叶子情况则没有。您需要在函数调用之间跟踪计数,可能通过返回idx
作为第二个返回值并相应地更新调用者的值。
请注意,在一个函数调用中对idx
的赋值对其他调用所看到的值没有影响。 idx
函数中的dfs
是局部变量,赋值只会将新值绑定到变量的本地副本。