我有未加权的有向图G,可能非常大(数千个节点)。
我有兴趣在具有有限边数的特定两个节点之间找到所有可能的路径(没有周期)(最多路径包含10个边)。有没有可以处理这个大图的快速算法。
答案 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的要求是回溯点。这是一般性描述:
v
v
个孩子,直到你得到你的孩子
目标或已超过路径长度要求对于任何目标顶点(v,u)
,这将找到距离u
最多10个的所有路径。
路径的数量可能是指数级的(我认为NP难度问题不太确定)。高效算法取决于您的领域知识。您可以将启发式方法合并到容易出现的无意义节点。