给定一个无向图,如何确定是否存在连接所有节点的路径,因此每个节点只访问一次?

时间:2017-03-08 05:05:20

标签: graph-theory theory

图表可以是循环的也可以是非循环的。目标是确定路径是否存在从任何节点到另一个节点,每个节点访问一次。

E.g。图

A <=> B
B <=> C
B <=> D

没有路径。无法构建包含每个节点的路径,其中每个节点仅访问一次。

我们可以假设每条边具有相同的长度,因为我们只是寻找路径的存在。我从最初的搜索中找不到任何好的算法,但我可能错过了它!

这只是我遇到的一个有趣的问题。如果需要更多信息,请告诉我!

2 个答案:

答案 0 :(得分:1)

这是一个Hamiltonian path problem,没有办法轻易解决。这个问题属于NP-complete类,一般来说,这些问题需要指数量的时间和内存才能解决完全。但是有一些相当复杂的启发式算法。例如,“旅行商问题”是汉密尔顿路径问题的一个特例,你可以看一下解决问题的方法。

答案 1 :(得分:0)

我的解决方案是循环遍历图的每个顶点,然后从那里开始。然后递归地遍历每个相邻节点以查看是否可以从该子路径获得路径。但这个解决方案是我相信n ^ 2,所以我想知道是否有更好的解决方案。

伪代码:

def check_graph(graph)
{
   foreach (vertex of graph)
   {
      if (is_path_possible(graph, vertex)
        return true;
   }

   return false;
}


def is_path_possible(graph, source) 
{
  if !graph.nodes.contains(source)
    return false;

  if graph.nodes.count == 1
    return true;

  foreach (neighbor of source)
  {
    child_graph = graph - source;

    is_child_path_possible = is_path_possible(child_graph, neighbor);

    if (is_child_path_possible)
      return true;
  }

  return false;
}