如何在图表中找到所有“长”简单的非循环路径?

时间:2011-11-11 19:06:28

标签: graph path traversal directed-graph powerset

假设我们有一个完全连接的有向图G。顶点是[a,b,c]。每个顶点之间的两个方向都有边缘。

给定一个起始顶点a,我想在所有方向上遍历图形并仅在我击中已经在路径中的顶点时保存路径。

因此,函数full_paths(a,G)应返回:

- [{a,b}, {b,c}, {c,d}]
- [{a,b}, {b,d}, {d,c}]
- [{a,c}, {c,b}, {b,d}]
- [{a,c}, {c,d}, {d,b}]
- [{a,d}, {d,c}, {c,b}]
- [{a,d}, {d,b}, {b,c}]

我不需要[{a,b}][{a,b}, {b,c}]等“不完整”结果,因为它已包含在第一个结果中。

除了生成G的powerset并过滤掉一定大小的结果外,还有其他办法吗?

我该如何计算?

编辑:正如Ethan指出的那样,这可以通过深度优先搜索方法解决,但不幸的是我不明白如何修改它,使其在回溯之前存储路径(我使用Ruby Gratr来实现我的算法)

2 个答案:

答案 0 :(得分:1)

您是否研究过depth first search或某些变体?深度优先搜索尽可能遍历然后回溯。您可以在每次需要回溯时记录路径。

答案 1 :(得分:1)

如果您知道图表 G 完全关联,那么当N!是图表中的顶点数时,N路径的长度为N G N 即可。您可以通过这种方式轻松计算它。您有N-1个选择起始点的可能性,然后对于每个起始点,您可以选择N*(N-1)*...*2*1 = N!个顶点作为路径上的第二个顶点,依此类推,当您只能在每个路径上选择最后一个未访问过的顶点时。所以你有G'个可能的路径。当您无法选择起始点时,即它被赋予它与使用N-1顶点在图形 perm_to_path([A|[B|_]=T]) -> [{A,B}|perm_to_path(T)]; perm_to_path(_) -> []. 中查找路径相同。所有可能的路径都是所有顶点集的排列,即在您的情况下是除起点之外的所有顶点。当你有排列时,你可以通过以下方式生成路径:

permutations([]) -> [];
permutations(L) ->
  [[H|T] || H <- L, T <- permutations(L--[H])].

如何生成排列的最简单方法是

paths(A, GV) -> [perm_to_path([A|P]) || P <- permutations(GV--[A])].

所以在你的情况下:

GV

其中G是图表 {{1}} 的顶点列表。

如果你想要更高效的版本,它需要更多的诡计。