Algorithm 查找恰好访问有向图所有顶点一次的路径

Algorithm 查找恰好访问有向图所有顶点一次的路径,algorithm,graph,traveling-salesman,hamiltonian-cycle,Algorithm,Graph,Traveling Salesman,Hamiltonian Cycle,给定一个有向图,什么是只访问图的每个顶点一次的算法。这与哈密顿循环不同,我不要求路径在同一个顶点开始和结束 回溯算法 我想到的一个算法是回溯,使用递归实现,在每一步中,您都会探索所有可能的连接/路径,并保留一个布尔访问数组,以确保不会多次访问任何顶点。向后回溯时,此布尔值将设置为false(回溯中的基本步骤)。基本情况是比较访问的顶点数,并查看它是否与图中的节点数匹配,在这种情况下,它将返回true。另一种基本情况是,如果所有顶点都未被访问,但不存在继续递归的其他连接,则返回false 但是,这

给定一个有向图,什么是只访问图的每个顶点一次的算法。这与哈密顿循环不同,我不要求路径在同一个顶点开始和结束

回溯算法 我想到的一个算法是回溯,使用递归实现,在每一步中,您都会探索所有可能的连接/路径,并保留一个布尔访问数组,以确保不会多次访问任何顶点。向后回溯时,此布尔值将设置为false(回溯中的基本步骤)。基本情况是比较访问的顶点数,并查看它是否与图中的节点数匹配,在这种情况下,它将返回true。另一种基本情况是,如果所有顶点都未被访问,但不存在继续递归的其他连接,则返回false

但是,这种方法的时间复杂度是
O(n!)
,这是不可取的

有没有更好的算法来寻找一个有向图的路径/遍历,它只覆盖图中的每个顶点一次。

根据《算法导论》一书,这个问题是NP完全问题。对于这个问题没有多项式算法,但没有证明它不存在。所以在最坏的情况下,你们会得到指数时间复杂度

一些注释。 若图有一个叶,那个么这个叶是路径的开始或结束。若图有两片叶子,那个么路径必须从其中一片叶子开始,在另一片叶子结束。 若图有三个或更多的叶子,那个么哈密顿路径就不存在。但对于一般的图,没有快速算法。

根据《算法导论》一书,这个问题是NP完全问题。对于这个问题没有多项式算法,但没有证明它不存在。所以在最坏的情况下,你们会得到指数时间复杂度

一些注释。 若图有一个叶,那个么这个叶是路径的开始或结束。若图有两片叶子,那个么路径必须从其中一片叶子开始,在另一片叶子结束。
若图有三个或更多的叶子,那个么哈密顿路径就不存在。但是对于一般的图,没有快速算法。

不确定这是否有效,但是查看强连接组件()和图的压缩可能有助于减少运行时间。但我的感觉是,在最坏的情况下,你不会比O(n!)更好。如果你有一个有效的算法来解决这个问题,你也可以有效地解决哈密顿循环(其中“有效”是指“在多项式时间内”):对于哈密顿循环的任何给定实例,通过删除单个顶点,创建哈密顿路径问题的n个实例。使用您的高效算法n次(每个实例一次)在每个实例中查找HP(如果存在)。如果这n个图中有一个HP,并且可以通过添加在该图中删除的特定顶点将其转换为HC,那么您已经找到了一个HC——如果没有,就不可能有任何HC。@Henry,据我所知,强连通组件是指组件中的每个顶点都可以从同一组件中的另一个顶点到达的组件。虽然有像Tarjan这样的高效算法,但我觉得我的问题有点不同。我只寻找到达所有顶点。你还认为有比n更好的解决方案吗!为了解决这个问题?@j_random_hacker,这是一个很好的矛盾证明。这个删除一个顶点的过程会以递归的方式进行吗,直到我们得到一个只有一个节点的图,这是一个哈密顿路径和一个哈密顿循环。如果有多个强连通分量,假设有分量a和分量B,您可以从A到达B,但不能从B到达A,那么A中的所有节点必须位于访问所有节点的路径中B中的节点之前。这大大减少了排列的数量。不确定这是否有效,但查看强连接组件()和图形的压缩可能有助于减少运行时间。但我的感觉是,在最坏的情况下,你不会比O(n!)更好。如果你有一个有效的算法来解决这个问题,你也可以有效地解决哈密顿循环(其中“有效”是指“在多项式时间内”):对于哈密顿循环的任何给定实例,通过删除单个顶点,创建哈密顿路径问题的n个实例。使用您的高效算法n次(每个实例一次)在每个实例中查找HP(如果存在)。如果这n个图中有一个HP,并且可以通过添加在该图中删除的特定顶点将其转换为HC,那么您已经找到了一个HC——如果没有,就不可能有任何HC。@Henry,据我所知,强连通组件是指组件中的每个顶点都可以从同一组件中的另一个顶点到达的组件。虽然有像Tarjan这样的高效算法,但我觉得我的问题有点不同。我只寻找到达所有顶点。你还认为有比n更好的解决方案吗!为了解决这个问题?@j_random_hacker,这是一个很好的矛盾证明。这个删除一个顶点的过程会以递归的方式进行吗,直到我们得到一个只有一个节点的图,这是一个哈密顿路径和一个哈密顿循环。如果有多个强连通分量,假设有分量a和分量B,您可以从A到达B,但不能从B到达A,那么A中的所有节点必须位于访问所有节点的路径中B中的节点之前。这大大减少了排列的数量。谢谢。当你们说,“在最坏的情况下,你们的时间复杂度是指数级的”,你们是说n!或者有没有比n更好的x^y算法!对不起,我没有指定它。我是说n!谢谢你。当你们说,“在最坏的情况下,你们的时间复杂度是指数级的”,你们是说n!或者有更好的算法是x^y,