Graph 如何找到所有';长';图中的简单非循环路径?

Graph 如何找到所有';长';图中的简单非循环路径?,graph,path,traversal,directed-graph,powerset,Graph,Path,Traversal,Directed Graph,Powerset,假设我们有一个完全连通的有向图G。顶点是[a,b,c]。每个顶点之间都有两个方向的边 给定一个起始顶点a,我希望在所有方向上遍历图形,并且仅当我碰到已在路径中的顶点时才保存路径 因此,函数完整路径(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}

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

给定一个起始顶点
a
,我希望在所有方向上遍历图形,并且仅当我碰到已在路径中的顶点时才保存路径

因此,函数
完整路径(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实现我的算法)

你有没有研究过它或一些变化?深度优先搜索尽可能地遍历,然后返回。您可以在每次需要回溯时记录路径

如果您知道图形
G
已完全连接,则存在
NN
是图形中的顶点数
G
时,代码>长度
N
的路径。你可以用这种方法很容易地计算出来。您可以选择
N
起始点,然后对于每个起始点,您可以选择
N-1
顶点作为路径上的第二个顶点,当您只能选择每个路径上最后一个未访问的顶点时,依此类推。所以你有
N*(N-1)*…*2*1=N可能的路径。当您无法选择起点(即给定起点)时,它与在带有
N-1
顶点的图形
G'
中查找路径相同。所有可能的路径都是所有顶点集的排列,即在您的情况下,除了起点之外的所有顶点。当您进行排列时,您可以通过以下方式生成路径:

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])].
置换([])->[];
排列(L)->

[H | T]| H Ethan,我考虑过dfs,但我不知道如何准确记录每条路径。请查看回调选项和中给出的示例。您可以使用回调来跟踪遍历的边和访问的顶点来跟踪每条路径。
paths(A, GV) -> [perm_to_path([A|P]) || P <- permutations(GV--[A])].