如何在图中找到精确长度的路径

时间:2012-06-04 12:07:42

标签: algorithm graph-algorithm path-finding

我想在无向图中找到固定长度的路径(在运行程序时给出)。我正在使用图表的邻接矩阵 我尝试使用一些算法,如DFS或A *,但它们只返回最短路径。

无法再次访问节点。

因此,假设我的图表有9个节点,最短路径是从4个节点构建的 我希望有一个额外的变量,它将“告诉”我想要找到具有7个节点的路径的算法(例如),并且它将返回包含在我的预期路径中的节点{1,2,4,5,6, 7,8}。
当然,如果没有我想要的路径解决方案,它将不返回任何内容(或者它将返回接近我的表达的路径,假设19而不是20)。

有人告诉DFS有回溯,但我对此一无所知 有人可以解释如何使用DFS进行回溯或推荐一些其他算法来解决这个问题吗?

5 个答案:

答案 0 :(得分:6)

回溯确实似乎是一个合理的解决方案。想法是递归地找到所需长度的路径。

Psuedo代码:

DFS(depth,v,path):
  if (depth == 0 && v is target): //stop clause for successful branch
       print path
       return
  if (depth == 0): //stop clause for non successful branch
       return
  for each vertex u such that (v,u) is an edge:
       path.append(v) //add the current vertex to the path
       DFS(depth-1,u,path) //recursively check all paths for of shorter depth
       path.removeLast() // clean up environment

上述算法将生成所需深度的所有路径。
使用DFS(depth,source,[])进行调用(其中[]为空列表)。

注意:

  • 算法将生成可能不简单的路径。如果您只需要简单的路径 - 您还需要保持visited设置,并在将每个顶点附加到找到的路径时添加每个顶点,并在从路径中删除它时将其删除。
  • 如果你只想找到一个这样的路径 - 你应该从函数返回值,(如果找到这样的路径,则为true),并在返回值为真时断开循环(并返回true)。

答案 1 :(得分:2)

所述问题是NP完全的。鉴于解决问题的有效算法,Yo可以简单地解决Hamiltonian Cycle Problem

因此,不存在多项式时间解(除非P = NP)。对于详尽的搜索,指数时间解决方案,请检查@ amit的答案。

答案 2 :(得分:1)

单个dfs应该足够了:

void dfs(int start, int hops)
{
  if(hops == k && start == t)
    {
      path++;
      return;
    }
  else if(hops >= k)
    return;
  for(int w = 1; w <= n; w++)
    if(routes[start][w])
      dfs(w, hops + 1);
}

这里,k是路径的长度,而路由[] []是图的邻接矩阵。 path是一个全局变量。这可以解释周期 - 它考虑了给定长度的所有路径。从main,致电

path = 0;
dfs(source, k);
cout<<path;

请注意,节点数比跳数多一个。另请注意,如果路径的长度很大,则此函数会快速堆叠。没有双关语。

答案 3 :(得分:0)

尝试找到最长的路径,然后将其切割到所需的长度。最长的路径也称为图的直径。通过为每个顶点运行DFS可以找到最长的路径。

答案 4 :(得分:0)

假设您可以在图形中找到长度为d的路径,那么您可以运行此算法| V |时间并找到NP完全的最长路径。所以你可以尝试以下方法 -

1)近似算法 2)蛮力方法(更适合编程)。使用GPU加速代码。

您也可能对此感兴趣 -

存在DAG的线性时间算法。