找到所有BFS/DFS遍历



给出了一个无方向的循环图,我想找到所有可能的遍历,并通过广度优先搜索或深度优先搜索。该图作为邻接列表:

A-BC
B-A
C-ADE
D-C
E-C

因此,来自根A的所有BFS路径都是:

{ABCDE,ABCED,ACBDE,ACBED}

和DFS:

{ABCDE,ABCED,ACDEB,ACEDB}

我将如何以有意义的方式生成这些遍历算法?我想一个人可以生成所有字母的排列并检查它们的有效性,但这似乎是我的最后路由。

任何帮助将不胜感激。

除了您实际执行所有可能的DFS和BFS遍历的明显方式外,您可以尝试此方法:

步骤1。在从根开始的DFS遍历中,当前访问的节点的邻接列表如下:首先从列表中删除节点的父。第二个生成了调整列表中其余节点的所有排列。

因此,如果您在节点C中,您将做一个节点A:

C -> ADE transform into C -> DE transform into C -> [DE, ED]

步骤2。在步骤1之后,您将获得以下转换的调整列表:

A -> [CB, BC]
B -> []
C -> [DE, ED]
D -> []
E -> []

现在,您启动从(a,0)开始的处理,该处理中的第一项是遍历路径,第二个是索引。假设我们有两个队列。BFS队列和DFS队列。我们将这对排成两个队列。

现在,我们重复以下内容,首先以一个队列为止,直到它为空,然后再为另一个队列。

我们将第一对从队列中弹出。我们得到(A,0)。节点映射到[BC,CB]。因此,我们生成两个新的路径(ACB,1)和(ABC,1)。将这些新路径放在队列中。

将其中的第一个从队列中取出(ACB,1)。索引为1,因此我们查看路径字符串中的第二个字符。这是C.节点c映射到[de,ed]。

  • 这条路径的BFS子女将是(ACBDE,2)和(Acbed,2),我们通过附加获得的孩子置换。
  • 该路径的DFS子女将是(ACDEB,2)和(ACEDB,2),我们通过插入在C进入路径字符串后的子置换量。

我们根据上述队列的队列生成新路径,并将其放在队列中。因此,如果我们正在研究BFS队列(ACBDE,2)和(Acbed,2)。我们队列的内容现在为:(ABC,1),(Acbde,2),(Acbed,2)。

我们在队列中弹出(ABC,1)。由于B没有孩子,因此生成(ABC,2)。并获得队列:(Acbde,2),(Acbed,2),(ABC,2)等。在某个时候,我们将最终得到一对对路径中不包含索引的对。例如,如果我们得到(Acbed,5),我们知道这是一条完成的路径。

bfs应该非常简单:每个节点都有一定的深度。在您的示例中,您在深度0,深度为1的深度为b和c处,在深度2处E和d。在每个BFS路径中,您将以深度0(a)为第一个元素,然后将其作为第一个元素深度1(b和c)处的元素,然后在深度2(e和d)等处的任何元素排列,等等...如果您查看示例,则您的4个BFS路径匹配该模式。A始终是第一个元素,其次是BC或CB,其次是DE或ED。您可以将其推广到具有更深深度的节点的图形。为了找到这一点,您需要的只是1个Dijkstra搜索,这很便宜。

在DFS中,您没有深度分离的良好分离,这使BFS直接直接。我没有立即看到一种算法,该算法效率很高。您可以通过穿越图形和回溯来设置图形结构并建立路径。在某些情况下,这不是很高效,但可能足以适合您的应用。

最新更新