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

Algorithm 如何在图中找到精确长度的路径,algorithm,graph-algorithm,path-finding,Algorithm,Graph Algorithm,Path Finding,我想在无向图中找到固定长度的路径(在运行程序时给出)。我正在使用图形的邻接矩阵。 我尝试使用一些算法,如DFS或A*,但它们只返回最短路径 无法再次访问节点 假设我的图有9个节点,最短路径由4个节点组成。 我想要一个额外的变量,它将“告诉”算法我想要找到有7个节点的路径(例如),它将返回包含在我期望的路径{1,2,4,5,6,7,8}中的节点。 当然,如果没有我想要的路径的解决方案,它将不返回任何内容(或者它将返回接近我的表达式的路径,比如说19而不是20) 有人告诉过我DFS的回溯功能,但我对

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

无法再次访问节点

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

有人告诉过我DFS的回溯功能,但我对此一无所知。

有人能解释一下如何将DFS与回溯结合使用,或者推荐一些其他算法来解决这个问题吗?

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

回溯看起来确实是一个合理的解决方案。其思想是递归地找到所需长度的路径

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(深度,源代码,[])
调用(其中
[]
是一个空列表)

注:

  • 该算法将生成可能不简单的路径。如果只需要简单路径-还需要维护
    已访问的
    集,并在将每个顶点附加到找到的路径时将其添加,在将其从路径中移除时将其移除
  • 如果只想找到一个这样的路径,那么应该从函数返回值(如果找到这样的路径,则返回true),并在返回值为true时中断循环(并返回true)

    • 所述问题是NP完全问题。只要给出一个有效的算法,你就能轻松地解决问题


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

      单个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);
      }
      
      void dfs(整数开始,整数跃点)
      {
      if(跃点==k&&start==t)
      {
      path++;
      返回;
      }
      否则如果(跳数>=k)
      返回;
      
      对于(int w=1;w假设你可以在一个图中找到一条长度为d的路径,那么你可以运行这个算法| V |次,找到NP完全的最长路径。因此你可以尝试以下方法-

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

      您也可能感兴趣的是-


      DAG存在一个线性时间算法。

      “路径接近我的期望”-这是模糊的。我试图用Java编写您的伪代码,但有点错误,我不知道是什么:其中adj[][]是我的图形邻接矩阵,路径存储在堆栈中。嗯,不能确定,但从第一眼看:(1)为什么要从1迭代到numVertex inclusive,而不是从0迭代到numVertex-1 inclusive?java中的数组是基于0的。(2)在递归调用之后,您似乎错过了
      VISISTER.pop()
      ,因此
      VISISTER
      集被填充,但在用尽某个路径后,元素永远不会被取出。(3)对于
      depth==0&&v不是target
      ,应该还有另一个stop子句(我在伪代码中也遗漏了这个子句,很快就会编辑),它应该终止这个分支。我有这样的图(现在我正在测试这个图):…当我给出depth 8和start 1 end 9(1,9)时,DFS什么也不显示。它应该写[1,2,3,6,5,4,7,8,9]或[1,4,7,8,5,2,3,6,9]。当我给出深度3和开始1结束2(1,2)时,它会正确写入[1,4,5,2],但当我将深度更改为5-无时,它至少应该给出[1,4,7,8,5,2].我不知道这里出了什么问题:在DFS中,n是节点数,k是我想要的路径长度,t是结束节点,对吗?哦,对不起。我没有意识到你需要实际的路径…这只会给你路径数。:P
      path = 0;
      dfs(source, k);
      cout<<path;