繁体   English   中英

查找嵌套图中的所有路径

[英]Finding all paths in nested graphs

我一直在努力寻找一个似乎是一个相对简单的问题的解决方案。

给出图g:

g = {'A': ['B', 'C'],
     'B': ['A', 'C'],
     'C': ['D'],
     'D': [],
     }

可以使用此解决方案找到所有路径(我在此处找到):

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'] ] 

前两个路径组合在一起的位置(即,总共我希望获得两个路径)。 但是上述功能还不够。 我已经尝试将此代码改编为我的问题,但我没有成功。

我正在使用的实际图形要大得多,字典中的许多元素都是这些嵌套列表,因此路径的数量可能会相当快地增长。

我希望这个例子有意义。 任何帮助将不胜感激。

>>> {key:[ele for lst in value for ele in lst] for key, value in g2.iteritems()}
{'A': ['B', 'C', 'D'], 'C': ['D'], 'B': ['A', 'C'], 'D': []}

在我看来, 扁平列表将解决您的问题。

或者,没有字典和列表理解:

result = {}
for key, value in g2.iteritems():
    result[key] = []
    for lst in value:
        for ele in lst:
            result[key].append(ele)

如果要通过原始图形g2对结果进行排序:

# Sort by 2nd value in list
res = []
for lst in g2['A']:
    res.append([])
    for reslst in res:
        if reslst[1] in lst:
            res[-1].append(reslst)
    if len(res[-1]) == 0:
        res.pop()

[[['A', 'B', 'C', 'D'], ['A', 'C', 'D']], [['A', 'D']]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM