具有有界边数的未加权无向图中两个节点之间的所有路径

时间:2014-11-10 16:01:21

标签: algorithm graph path graph-theory shortest-path

我有未加权的有向图G,可能非常大(数千个节点)。

我有兴趣在具有有限边数的特定两个节点之间找到所有可能的路径(没有周期)(最多路径包含10个边)。有没有可以处理这个大图的快速算法。

3 个答案:

答案 0 :(得分:1)

您可以修改dfs来解决此问题。只需添加另一个参数 - 当前的深度,然后在目标节点target之前达到路径长度限制时剪切dfs。为了演示这个想法,我将使用递归实现,我将使用全局数组used - 在途中访问过的节点。此外,我将假设我们使用邻居列表表示存储图形(让我们称之为neList,节点v的邻居位于neList [v]):

used[n] = {false}
neList; // neighborhoodList
limit = 10 // max path len
void dfs(int v, int depth) {
  if (depth == limit) {
    if (v == target) {
       print_path
    } else {
       return
    }
  }
  for u in neList[v] {
    if (used[u]) {
      continue;
    }
    used[u] = true
    dfs(u, depth + 1)
    used[u] = false
  }
}

您可以稍微优化此方法 - 首先从目标节点执行bfs以计算target与所有节点之间的min_distance。在dfs中只有u才能转到邻居depth + min_dist[u] <= limit

答案 1 :(得分:0)

在最坏的情况下,不可能有效地做到这一点。想象一下完整的图表。让我们计算恰好有10条边的路径数。它是1 * (n - 2) * (n - 3) * ... * (n - 9) * 1 = O(n ^ 8)。对于具有几千个节点的图表来说太过分了。

答案 2 :(得分:0)

我会回答@Ivaylo Strandjev的回答。问题是all-simple paths问题。回溯是要走的路。回溯只是DFS,在某些时候算法回溯到前一个节点。您对max(长度)= 10的要求是回溯点。这是一般性描述:

  1. 从任何顶点v
  2. 开始
  3. 检查v个孩子,直到你得到你的孩子 目标或已超过路径长度要求
  4. 回溯。
  5. 对于任何目标顶点(v,u),这将找到距离u最多10个的所有路径。 路径的数量可能是指数级的(我认为NP难度问题不太确定)。高效算法取决于您的领域知识。您可以将启发式方法合并到容易出现的无意义节点。