我有一个定向循环图,由节点a,b,c,d,e,f g组成,其中节点连接到每个其他节点。边缘可以是单向的或双向的。我需要打印出这样的有效订单,例如。 f-> a-> c-> b-> e-> d-> g使得I可以从起始节点到达端节点。请注意,所有节点必须存在于输出列表中。 另请注意,图表中可能有周期。
我想出了什么: 基本上我们首先可以尝试找到一个起始节点。如果存在一个节点,使得没有传入边缘(可能最多只有一个这样的节点)。我可能会找到一个起始节点,也可能不会。此外,我将进行一些预处理以找到节点的总数(让我们称之为n)。现在,我将从起始节点开始一个DFS,当我到达它们并计算我访问过的节点数时,将节点标记为已访问。如果我可以通过这种方法到达n个节点。我做完。如果我点击一个节点,从那里没有任何未经访问的节点的传出边缘,我已经达到了死胡同,我只会将该节点标记为未访问,减少指针并转到其上一个节点以尝试不同的路径
当我找到一个起始节点时就是这种情况。如果我没有找到一个起始节点,我将只需要尝试使用各种节点。
我不知道我是否接近解决方案。在这方面有谁能帮助我?
答案 0 :(得分:0)
在我看来,如果节点没有传入边缘,则意味着该节点是一个起始节点。您可以使用此起始节点遍历图形。如果此启动节点无法访问所有n个节点,则没有解决方案(正如您所说的那样,所有节点必须存在于输出列表中)。这是因为如果您从其他一些节点开始,您将无法访问此起始节点。
答案 1 :(得分:0)
您的解决方案的问题在于,如果您输入循环,则不知道是否以及何时退出。
在这些条件下进行DFS搜索很容易成为非多项式任务!
让我为您的问题介绍一个多项式算法。 看起来很复杂我希望有简化的余地。
这是我建议的解决方案
1)对于每个节点构造它可以到达的节点表(如果a可以到达b和c; b可以到达d; c可以到达e; a可以到达b,c,d,e甚至很难到达不是通过所有这些路径的单一路径)。
如果没有节点可以覆盖你完成的所有其他节点:没有你正在寻找的路径。
2)查找循环。这很简单:如果节点可以到达自己,那么就有一个循环。这应该是前一点表格构建的一部分。
找到一个循环后,您可以将它(及其节点)缩小到代表节点,该节点的进入(传出)连接是循环中节点的进入(传出)连接的并集。
你不断减少循环,直到你不能再做了。
3)此时,您将看到一个非循环图,如果有一条连接所有节点的路径,则有一个节点连接到所有节点并从中开始,您可以执行深度优先搜索。
4) 通过用循环入口点到出口点的循环替换代表节点的遍历来记下路径。