Algorithm 我怎样做这个图遍历?

Algorithm 我怎样做这个图遍历?,algorithm,graph-algorithm,graph-traversal,Algorithm,Graph Algorithm,Graph Traversal,我有一个由节点a,b,c,d,e,fg组成的有向循环图,其中每个节点都与其他节点相连。边缘可以是单向的或双向的。我需要像这样打印一个有效的订单,例如f->a->c->b->e->d->g,这样我就可以从开始节点到达结束节点。请注意,输出列表中必须存在所有节点。 还请注意,图表中可能存在循环 我想到的是: 基本上,首先我们可以尝试找到一个开始节点。如果有一个节点没有传入边缘(可能有一个这样的节点)。我可能会找到开始节点,也可能找不到。此外,我还将进行一些预处理,以找到节点的总数(我们称之为n)。现

我有一个由节点a,b,c,d,e,fg组成的有向循环图,其中每个节点都与其他节点相连。边缘可以是单向的或双向的。我需要像这样打印一个有效的订单,例如f->a->c->b->e->d->g,这样我就可以从开始节点到达结束节点。请注意,输出列表中必须存在所有节点。 还请注意,图表中可能存在循环

我想到的是: 基本上,首先我们可以尝试找到一个开始节点。如果有一个节点没有传入边缘(可能有一个这样的节点)。我可能会找到开始节点,也可能找不到。此外,我还将进行一些预处理,以找到节点的总数(我们称之为n)。现在,我将从开始节点启动DFS,在到达节点时将节点标记为已访问,并计算我访问了多少节点。如果我能用这个方法到达n个节点。我完了。如果我击中了一个节点,从该节点到任何未访问的节点都没有传出边,那么我就击中了一个死胡同,我只会再次将该节点标记为未访问,减少指针并转到其上一个节点以尝试不同的路由

当我找到一个开始节点时就是这样。如果我没有找到一个开始节点,我将不得不尝试不同的节点


我不知道我是否已经接近解决方案。在这方面有人能帮我吗?

在我看来,如果节点没有传入边缘,则表示该节点是开始节点。可以使用此开始节点遍历图形。如果这个开始节点不能访问所有n个节点,那么就没有解决方案(正如您所说的,所有节点都必须出现在输出列表中)。这是因为如果从其他节点开始,您将无法到达该开始节点。

解决方案的问题在于,如果您进入循环,您不知道是否以及何时退出

在这些条件下进行DFS搜索很容易成为非多项式任务

让我为你的问题介绍一个多项式算法。 它看起来很复杂,我希望有简化的余地

这里是我的建议解决方案

1) 对于每个节点,构建其可以到达的节点表(如果a可以到达b和c;b可以到达d;c可以到达e;a可以到达b、c、d、e,甚至没有一条路径从a穿过所有节点)

如果没有一个节点可以到达所有其他节点,那么就没有您要寻找的路径

2) 查找循环。这很简单:如果一个节点可以到达它自己,就有一个循环。这应该是上一点表格构造的一部分

找到一个循环后,可以将其(及其节点)收缩到代表性节点,该节点的输入(输出)连接是循环中节点的输入(输出)连接的并集

你一直在减少循环,直到你不能再做更多

3) 此时,您将看到一个非循环图,如果有一条路径连接所有节点,则有一个节点连接到所有节点,并且可以从该路径开始执行深度优先搜索

(四)
通过将代表性节点的遍历替换为从循环入口点到出口点的循环来写下路径

您的DFS解决方案似乎是合法的,有什么问题吗?问题是什么?我不明白“查找开始节点”是什么意思?如果有图形,则应该有关于所有节点的信息。