我们如何才能找到初始节点以应用该算法?

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 中做什么?它可以转到 be。我们看到它选择了b,因为a->b是树边,a->e是前向边(查看tree/forward边的定义)。在 b 中,唯一的选择是访问 f。在 f 中,DFS 可以转到 aeg。我们可以假设它尝试访问 af->a 被标记为后缘,所以到目前为止一切都是正确的),然后它访问了 e 并且尝试访问 b.但是,我们现在遇到了边缘 f->g 的问题。标记为交叉边,表示DFS之前已经访问过g。否则,这条边会被标记为树边。所以,我们知道 a 不是初始节点。我们需要尝试其他选择。 c 呢?同样,所有从 c 出来的边都被标记为十字,而不是树,所以 c 不是初始节点。

d呢?如果 DFS 在 d 开始,它可能会从 dg,这就是发生的情况,因为 d->g 被标记为树边。没有节点可以从 g 出发,因此它回溯到 d 并访问了 h。它试图从 h 访问 g 但它之前已经访问过,因此 h->g 被标记为交叉正确。太好了,所以 d 是这个 DFS 执行的初始节点。在访问包含 dgh 的连接组件后,DFS 可以从 ac 重新开始,但我们已经知道它没有由于那些交叉边缘,从 c 开始。所以它从 a 开始,在访问 bfe 之后,它从 c.

开始