【发布时间】:2017-08-21 20:37:21
【问题描述】:
我一直在努力寻找一个看似相对简单的问题的解决方案。
给定一个图形 g:
g = {'A': ['B', 'C'],
'B': ['A', 'C'],
'C': ['D'],
'D': [],
}
可以使用这个解决方案找到所有路径(我找到了here):
def paths(graph, v):
path = [v] # path traversed so far
seen = {v} # set of vertices in path
def search():
dead_end = True
for neighbour in graph[path[-1]]:
if neighbour not in seen:
dead_end = False
seen.add(neighbour)
path.append(neighbour)
yield from search()
path.pop()
seen.remove(neighbour)
if dead_end:
yield list(path)
yield from search()
paths(g,'A')
>> [['A', 'B', 'C', 'D'], ['A', 'C', 'D']]
为了使事情更复杂,我想找到 g 中的所有路径,但当列表嵌套时。例如,取g为
g2 = {'A': [['B', 'C'],['D']],
'B': [['A'], ['C']],
'C': [['D']],
'D': [[]]}
我正在寻找的解决方案是
[ [['A', 'B', 'C', 'D'], ['A', 'C', 'D']], ['A', 'D'] ]
前两条路径组合在一起(即,我总共想要两条路径)。然而,上述功能是不够的。我已尝试根据我的问题调整此代码,但没有成功。
我正在使用的实际图表要大一些,而且字典中的许多元素都是这些嵌套列表,因此路径的数量可能会增长得相当快。
我希望这个例子有意义。任何帮助将不胜感激。
【问题讨论】:
-
有什么理由不只是扁平化列表吗?
{'A': ['B', 'C', 'D']}会在您的示例中给出所需的结果吗?如果不是,它有什么不同。