我们如何才能找到初始节点以应用该算法?
How can we find the initial node in order to apply the algorithm?
考虑以下图 G,并考虑在 G 处执行算法 DFS 时,图的边被表征为树边 (t)、后边 (b)、前边 (f) 和交叉edges(c) 如下图所示。对于图中的每个节点,找到节点的发现时间和完成时间。
换句话说,对于图中的每个节点 v,找到将算法 DFS 与该节点相关联的值 d[v] 和 f[v]。
请注意,值 d[v] 和 f[v] 只有一种可能的赋值。
你能告诉我如何找到初始节点以便开始应用深度优先搜索算法吗?
树的边缘应该形成一片森林。 DFS 可能已经开始的节点是没有传入树边缘的节点。
查看节点 a
- DFS 可以在节点 a
中做什么?它可以转到 b
或 e
。我们看到它选择了b
,因为a->b
是树边,a->e
是前向边(查看tree/forward边的定义)。在 b
中,唯一的选择是访问 f
。在 f
中,DFS 可以转到 a
、e
或 g
。我们可以假设它尝试访问 a
(f->a
被标记为后缘,所以到目前为止一切都是正确的),然后它访问了 e
并且尝试访问 b
.但是,我们现在遇到了边缘 f->g
的问题。标记为交叉边,表示DFS之前已经访问过g
。否则,这条边会被标记为树边。所以,我们知道 a
不是初始节点。我们需要尝试其他选择。 c
呢?同样,所有从 c
出来的边都被标记为十字,而不是树,所以 c
不是初始节点。
那d
呢?如果 DFS 在 d
开始,它可能会从 d
到 g
,这就是发生的情况,因为 d->g
被标记为树边。没有节点可以从 g
出发,因此它回溯到 d
并访问了 h
。它试图从 h
访问 g
但它之前已经访问过,因此 h->g
被标记为交叉正确。太好了,所以 d
是这个 DFS 执行的初始节点。在访问包含 d
、g
和 h
的连接组件后,DFS 可以从 a
或 c
重新开始,但我们已经知道它没有由于那些交叉边缘,从 c
开始。所以它从 a
开始,在访问 b
、f
和 e
之后,它从 c
.
开始
考虑以下图 G,并考虑在 G 处执行算法 DFS 时,图的边被表征为树边 (t)、后边 (b)、前边 (f) 和交叉edges(c) 如下图所示。对于图中的每个节点,找到节点的发现时间和完成时间。 换句话说,对于图中的每个节点 v,找到将算法 DFS 与该节点相关联的值 d[v] 和 f[v]。
请注意,值 d[v] 和 f[v] 只有一种可能的赋值。
你能告诉我如何找到初始节点以便开始应用深度优先搜索算法吗?
树的边缘应该形成一片森林。 DFS 可能已经开始的节点是没有传入树边缘的节点。
查看节点 a
- DFS 可以在节点 a
中做什么?它可以转到 b
或 e
。我们看到它选择了b
,因为a->b
是树边,a->e
是前向边(查看tree/forward边的定义)。在 b
中,唯一的选择是访问 f
。在 f
中,DFS 可以转到 a
、e
或 g
。我们可以假设它尝试访问 a
(f->a
被标记为后缘,所以到目前为止一切都是正确的),然后它访问了 e
并且尝试访问 b
.但是,我们现在遇到了边缘 f->g
的问题。标记为交叉边,表示DFS之前已经访问过g
。否则,这条边会被标记为树边。所以,我们知道 a
不是初始节点。我们需要尝试其他选择。 c
呢?同样,所有从 c
出来的边都被标记为十字,而不是树,所以 c
不是初始节点。
那d
呢?如果 DFS 在 d
开始,它可能会从 d
到 g
,这就是发生的情况,因为 d->g
被标记为树边。没有节点可以从 g
出发,因此它回溯到 d
并访问了 h
。它试图从 h
访问 g
但它之前已经访问过,因此 h->g
被标记为交叉正确。太好了,所以 d
是这个 DFS 执行的初始节点。在访问包含 d
、g
和 h
的连接组件后,DFS 可以从 a
或 c
重新开始,但我们已经知道它没有由于那些交叉边缘,从 c
开始。所以它从 a
开始,在访问 b
、f
和 e
之后,它从 c
.