我试了又试;找了又找,但没有真正找到一个算法来解决我的问题。我想枚举树中的所有路径,(不仅仅是简单的路径)那些以叶节点开始和结束的路径(虽然这是一个简单的约束)。
例如,对于一棵树;
1
/ \
2 3
/ \ / \
4 5 6 7我希望能够生成以下路径:
4
4-2-5
4-2-5-2-1-3-6
4-2-5-2-1-3-7
4-2-5-2-1-3-6-3-7
4-2-1-3-6
4-2-1-3-7
4-2-1-3-6-3-7
5
5-2-1-3-6
5-2-1-3-7
5-2-1-3-6-3-7
6
6-3-7
7我想这就是全部。
我已经尝试了以下解决方案Complexity of finding all simple paths using depth first search?。但是,这只能找到简单的路径,因此找不到4-2-5-2-1-3-6这样的路径。
你有没有任何方法可以指导我,或者任何算法?
发布于 2011-05-01 23:32:08
像4-2-1-2-5这样的路径算数吗?如果是这样的话,我想我有答案了:
在我看来,你只想让每条边被访问“一次”。因此,以图的“对偶”为例,将路径视为边的序列,而不是顶点的序列。这样,顶点边就变成了你的“顶点”,而顶点变成了“边”。
这应该会将您的问题减少到生成简单的图路径,这是一个您已经知道如何做的问题。
traverse(path, edg):
mark edg as visited
print path
for each edge (e2) sharing a vertex with edg:
traverse(e2, path+e2)
(with some sort of precaution to avoid duplicate paths being printed)发布于 2011-05-02 03:34:13
如果你的树是二叉树,这里有一个相当简单的递归算法。在Python中:
def lchild(u):
return 2 * u
def rchild(u):
return 2 * u + 1
def paths(u, depth):
if depth <= 0:
yield ((), (u,), ())
else:
for ldown, lpath, lup in paths(lchild(u), depth - 1):
yield ((u,) + ldown, lpath, lup + (u,))
for ldown, lpath, lup in paths(lchild(u), depth - 1):
for rdown, rpath, rup in paths(rchild(u), depth - 1):
yield ((u,) + ldown, lpath + lup + (u,) + rdown + rpath, rup + (u,))
for rdown, rpath, rup in paths(rchild(u), depth - 1):
yield ((u,) + rdown, rpath, rup + (u,))
if __name__ == '__main__':
for down, path, up in paths(1, 2):
print pathhttps://stackoverflow.com/questions/5847654
复制相似问题