Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何在图中找到包含一组节点的循环?_Algorithm_Graph Algorithm - Fatal编程技术网

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

Algorithm 如何在图中找到包含一组节点的循环?,algorithm,graph-algorithm,Algorithm,Graph Algorithm,给定一个无向图G=(V,E)和一组节点p。我需要找到一个包含这些节点的循环(不是最短长度的循环)?如何找到这个循环?我可能会通过选择p中的第一个节点(我们称之为p[0])开始设计算法,然后从p[0]开始运行深度优先搜索,注意再次到达p[0]的时间。您必须存储重新到达P[0]所采用的路径(或至少是否已到达P的其他节点),以便知道找到的任何循环都包含P中的所有节点。运行时间应与深度优先搜索相同,我认为是O(V+E) 有人可能会提出更好的解决方案,某些启发式方法可能会被应用于帮助,但这应该会让你开始。

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

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

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

编辑:

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

进一步编辑:

不要管最后一次编辑了——只有在能够确定p[0]和p中到达的节点之间的不同路径上没有其他无法通过其他方式到达的节点时,它才会起作用,如果不执行整个DFS,我们将无法确定这一点


关于哈密顿圈的答案,我不知道这个问题中的圈检测是NP完全的。是的,我们必须遍历从起点可以到达的整个图(所有顶点和边),以确定是否存在满足当前问题标准的循环。此外,我们需要知道在接触到之前访问过的顶点时,顶点的“前进路径”是什么,以确定是否存在符合标准的循环。因为我们不关心最短的周期,所以我不确定我们是如何找到一个哈密顿周期的。想启发一下吗?

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

对于所需的循环,你有任何条件吗?在循环上没有条件吗?你在寻找欧拉循环吗?没有,我只需要找到一个包含一组给定的图形节点的循环。类似的问题:哈密顿循环通过所有节点,因此没有更短或更长的节点。让我一步一步走。考虑这个特殊情况的问题(如果特殊情况是NP-难,一般情况下也是NP-难):图G =(V,E)和节点集合P=V(这就是为什么它是一个特殊的情况)。现在通过所有节点V的最短和最长循环都相等长,| V |。问题变成了寻找是否存在这样的东西,这就是哈密顿循环,它是NP完全的。所以我发现HC“在”这个问题里面。问题不是HC,而是它包含了HC。有道理吗?