什么是合适的算法?

时间:2012-12-02 02:37:51

标签: algorithm graph hamiltonian-cycle

我正在尝试做c ++程序。我正在尝试做一些有点数的问题。现在我需要找到贯穿所有要点的路径。这实际上不是TSP,因为根据我在TSP中的知识,可以从所有点到达每个其他点。但在我的情况下,点之间的路径网络是固定的,我只需要找到通过所有点的合适路径,前提是所有点都可能没有连接到其他每个点。那么我应该遵循什么算法。

2 个答案:

答案 0 :(得分:1)

您似乎正在寻找一种遍历图表的方法?如果是这样,您尝试使用广度优先搜索http://en.wikipedia.org/wiki/Breadth-first_search或深度优先搜索http://en.wikipedia.org/wiki/Depth-first_search来遍历您的图表。

答案 1 :(得分:1)

您想为图表找到Hamiltonian path

  

在图论的数学领域,哈密顿路径(或   可跟踪路径)是无向图中的路径,可以访问每个路径   顶点恰好一次。哈密​​顿循环(或哈密顿循环)是一个   哈密​​顿路径是一个循环。确定是否有这样的路径和   图中存在的周期是哈密顿路径问题,即   NP完全问题。

存在一些techniques

  

有n!不同的顶点序列可能是哈密顿量   在给定的n-顶点图中的路径(并且在完整的图中),所以a   蛮力搜索算法,测试所有可能的序列   很慢。有几种更快的方法。搜索程序   弗兰克鲁宾将图的边缘分为三类:   那些必须在路上的人,那些不能在路上的人,和   犹豫不决。随着搜索的进行,一组决策规则被分类   未定的边缘,并决定是否停止或继续   搜索。该算法将图形划分为可以的组件   单独解决。另外,Bellman的动态编程算法,   Held和Karp可用于及时解决问题O(n2 2n)。在   对于每组顶点和每个顶点,确定该方法   在S中的顶点v,是否有一个完全覆盖的路径   S中的顶点和v的结尾。对于S和v的每个选择,存在一个路径   for(S,v)当且仅当v具有邻居w使得存在路径时   for(S - v,w),可以从已经计算过的中查找   动态程序中的信息。

     

AndreasBjörklund提供了另一种方法   包含 - 排除原则,以减少计数问题   汉密尔顿循环次数到一个更简单的计数问题   计算周期覆盖,可以通过计算某些矩阵来解决   决定因素。使用这种方法,他展示了如何解决   蒙特利尔任意n-顶点图中的Hamiltonian循环问题   时间O中的Carlo算法(1.657n);对于二分图这个算法   可以进一步改进到时间O(1.414n)。

     

对于最大度为3的图表,可以进行仔​​细的回溯搜索   在时间O(1.251n)中找到哈密顿循环(如果存在)。