【问题标题】:Given an undirected graph, how do you determine if there exists a path, that connects all nodes, so each node is only visited once?给定一个无向图,你如何确定是否存在一条连接所有节点的路径,因此每个节点只被访问一次?
【发布时间】:2017-07-28 13:15:17
【问题描述】:

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

例如图表

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

不会有路径。没有办法构建包含每个节点的路径,其中每个节点只被访问一次。

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

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

【问题讨论】:

  • 您可以通过说您正在寻找一种方法来检查哈密顿路径或回路是否存在来简化您的问题,因为哈密顿路径是遍历每个顶点并且不会在顶点上结束的路径它开始于,哈密顿回路是一条遍历每个顶点并在它开始的顶点处结束的路径。我相信这个问题存在于NP中

标签: graph-theory theory


【解决方案1】:

这是一个Hamiltonian path problem,没有办法轻松解决。此问题属于 NP 完全类,一般而言,此类问题需要精确解决指数量的时间和内存。但是有一些相当复杂的启发式算法。例如,“旅行商问题”是哈密顿路径问题的一个特例,你可以看看解决它的方法。

【讨论】:

    【解决方案2】:

    我的解决方案是遍历图形的每个顶点,然后从那里开始。然后递归地遍历每个相邻节点,以查看该子路径是否可能存在路径。但是这个解决方案我相信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;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 2017-11-12
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      相关资源
      最近更新 更多