当前位置: 首页 > 面试题库 >

在有向图中寻找哈密顿路径的随机算法

段哲圣
2023-03-14
问题内容

从这篇维基百科文章:

http://en.wikipedia.org/wiki/Hamiltonian_path_problem

在大多数图中,汉密尔顿路径的随机算法如下:从随机顶点开始,如果没有邻居访问,则继续。如果没有其他未访问的邻居,并且形成的路径不是哈密顿量,则随机地均匀选择一个邻居,然后以该邻居为支点进行旋转。(也就是说,向该邻居添加一条边,并从该邻居删除现有边之一,以免形成环路。)然后,在路径的新端继续执行该算法。

我不太了解这个关键过程应该如何工作。有人可以更详细地解释此算法吗?也许我们最终可以使用更清晰的描述来更新Wiki文章。

编辑1: 我想我现在已经了解算法,但似乎只适用于无向图。谁能确认?

这就是为什么我认为它仅适用于无向图的原因:

替代文字http://www.michaelfogleman.com/static/images/graph.png

假设顶点编号如下:

123
456
789

假设到目前为止,我的路径是:9, 5, 4, 7, 8。8的邻居都被访问过。假设我选择5从中删除一条边。如果我删除(9,5),我最终会创建一个循环:5, 4, 7, 8, 5,因此看来我必须删除(5,4)并创建(8,5)。如果图形是无向的,那很好,现在我的路径是9、5、8、7、4。但是如果您想象这些边是有方向的,那不一定是有效的路径,因为(8,5)是边,但是(
5、8)可能不是。

编辑2: 我猜对于有向图,我可以创建(8,5)连接,然后让新路径为just 4, 7, 8, 5,但这似乎适得其反,因为我必须砍掉先前导致顶点5的所有内容。


问题答案:

基本上,一旦您对节点的随机选择以一种方式构造了图,使得最后一个顶点A没有未访问的相邻顶点,则需要使一个顶点可用以继续。

为此,请执行以下操作:随机选择一个相邻的顶点,删除其现有的一条边(在哈密顿路径中,任何单个顶点只能有两条边),然后从当前顶点到当前可用的随机选择的一条点绘制一条新边。然后,您从随机选择的顶点跟踪到图形的末尾(第一个只有一个边的顶点),并继续执行算法。

在各种可怕的伪代码中:

  Graph graph;
  Vertex current;
  Path path;

  while(!IsHamiltonian(path))
  {
    if(HasUnvisitedNeighbor(current, path))
    {
      Vertex next = SelectRandomUnvisited(current, path);
      DrawEdgeTo(next, current, path);
      current= next;
    }
    else
    {
       Vertex next = SelectRandomNeighbor(current, path);
       RemoveRandomEdgeFrom(next, path);
       DrawEdgeTo(next, current, path);
       path = FindEnd(next, current, path);  //Finds the end of the path, starting from next, without passing through current
    }
  }


 类似资料:
  • 本文向大家介绍欧拉路径和哈密顿路径,包括了欧拉路径和哈密顿路径的使用技巧和注意事项,需要的朋友参考一下 如果您可以在所有顶点之间绘制一条路径而无需重新绘制同一条路径,则该图形是可遍历的。基于此路径,本章将介绍一些类别,例如欧拉路径和欧拉电路。 欧拉之路 欧拉路径仅包含一次“ G”的每个边缘,至少包含一次“ G”的每个顶点。连通图G如果包含欧拉路径,则被认为是可遍历的。 示例 欧拉路径= dcabd

  • 我需要为一组有向无环图找到从节点 0 开始的最长路径。我正在使用维基百科中的最长路径问题算法。我已经让算法适用于大多数图形,但对于其他图形,它没有给出正确的结果。算法为: 图形实现使用邻接列表来存储图形。如果我传递一个图,例如: 我得到的答案5,这是正确的。但是,如果我通过图表: 然后我得到2,而正确答案应该是3。 我使用的TopSort2算法是: DFS 算法包括:

  • 哈密顿通路(回路)与哈密顿图(Hamilton图)通过图G的每个结点一次,且仅一次的通路(回路),就是哈密顿通路(回路)。下面总结四个定义,帮助大家理解。 一、哈密顿图定义 通过图中所有顶点一次且仅一次的通路称为哈密顿通路。 通过图中所有顶点一次且仅一次的回路称为哈密顿回路。 具有哈密顿回路的图称为哈密顿图。 具有哈密顿通路而不具有哈密顿回路的图称为半哈密顿图。 (1)哈密顿通路 设G=《V,E》

  • 我有一个有向图,看起来有点像这样。所有边都是单向的,存在循环,有些节点没有子节点。 我想要一个遍历算法,目标是在图中的任意位置找到一条长度为n个节点的路径。该算法应该执行以下操作: 起始节点是随机选择的,它遍历其子节点,并且访问的节点保留在某个位置以返回末尾的路径 可以再次访问相同的节点 如果它到达没有子级的节点,它将遍历具有未探索子级的最新节点。如果遍历了从起始节点开始的所有可能路径,请尝试从其

  • 我需要找到一个算法来找到有向图中的所有根,在O(n m)。 我有一个寻找单个根的算法: 在v中的某些v上运行DFS(v)。如果结果是一个生成树,则v是根。否则,结果就是树木成林。然后: 在最后一棵树的根上运行DFS(u)。如果结果是一棵生成树,那么u是根。否则,图中没有根 现在,如果我想找到所有的根,最好的方法是每次在最后一棵树的不同顶点上运行上述算法O(n)次吗?假设我找到了一个根,如果另一个根

  • 我有一个无向图,我想从一个起始节点列出所有可能的路径。2个节点之间的每个连接在列出的路径中是唯一的,例如,给出以下图表示: 我无法使用现有的算法来完成它,我知道像DFS。任何帮助都将非常感谢。

  • Dijkstra算法说 对于图中给定的源节点,算法找到该节点和其他节点之间的最短路径 我得到了算法来找到那个节点和其他节点之间的最短路径。但是我的问题是,如果我需要为Linkedin/facebook这样的大图找到两个特定节点(比如N1和N2)的最短路径,我需要计算该节点N1和领英上其他节点(用户,意味着十亿用户)之间的距离吗首先,将其存储在高速缓存中,然后在询问两个节点的最短距离时从高速缓存中返