如何在图中找到包含一组节点的循环?

时间:2010-10-11 17:06:59

标签: algorithm graph-algorithm

给定一个未定向的图G =(V,E)和一组节点P.我需要找到一个包含这些节点的循环(不是最短的长度循环)?我如何找到这个循环?

2 个答案:

答案 0 :(得分:4)

我可能会开始通过选择P中的第一个节点(让我们称之为P [0])来设计算法,然后从P [0]运行深度优先搜索,记下任何时候P [0]再次到达。您必须存储重新到达P [0]的路径(或至少是否已到达P的其他节点),以便您知道您找到的任何循环包含P中的所有节点。运行时间应该是与深度优先搜索相同,我认为是O(V + E)。

有人可能会提出更好的解决方案,并且某些启发式方法可能会用于帮助,但这应该可以帮助您入门。 (例如,你可以得出结论,你应该从P的节点开始,边缘最少,而不是从P [0]开始。)

修改

我还想到了另一件事......当你通过深度优先搜索到达P中的另一个节点时,DFS从一开始就不需要“重新开始”或者考虑没有的路径包括这个新发现的节点。在没有这样的循环的情况下,此属性可以帮助您的算法更快地终止。

进一步修改:

不要介意最后一次编辑 - 它只有在可以确定P [0]与P到达的节点之间的P路径中没有节点的情况下才能正常工作,而且我们无法通过另一种方式到达如果不做整个DFS,我肯定不会知道。

关于汉密尔顿循环的答案,我不知道当前问题中的循环检测是如何完成NP的。是的,我们必须遍历从起点可到达的整个图形(所有顶点和边缘),以确定是否存在满足当前问题标准的循环。此外,我们需要知道在与先前访问的顶点接触时顶点的“前向路径”将确定是否存在满足标准的循环。但是,由于我们并不关心这种最短的周期,我不确定我们如何必须尝试找到哈密顿循环。关心开导?

答案 1 :(得分:2)

包含哈密顿循环(对于P = V),因此决策问题(只知道是否存在这样的事物)是NP完全的。因此,除非P = NP,否则没有有效的算法。