Algorithm Python:在字典表示的图形中列出所有可能的路径

Algorithm Python:在字典表示的图形中列出所有可能的路径,algorithm,python-3.x,dictionary,nodes,traversal,Algorithm,Python 3.x,Dictionary,Nodes,Traversal,我有一个字典,其中键表示节点,值表示键可以遍历到的可能节点 例如: dependecyDict = { 'A': ['D'], 'B': ['A', 'E'], 'C': ['B'], 'D': ['C'], 'G':['H']} 我想创建一个新的dicitonary,ChainsDict,它将包含所有“值”,每个“键”都可以通过dependecyDict遍历到这些值 例如,本示例程序的输出将为: ChainsDict = {'A': ['D', 'C', 'B','E'], 'B':['A'

我有一个字典,其中键表示节点,值表示键可以遍历到的可能节点

例如:

dependecyDict = { 'A': ['D'], 'B': ['A', 'E'], 'C': ['B'], 'D': ['C'], 'G':['H']}
我想创建一个新的dicitonary,ChainsDict,它将包含所有“值”,每个“键”都可以通过dependecyDict遍历到这些值

例如,本示例程序的输出将为:

ChainsDict = {'A': ['D', 'C', 'B','E'], 'B':['A','D','C','E'], 'C':['B','A','D','E'], 'D':['C','B','A','E'], 'G': ['H']}
我认为使用递归算法是制定解决方案的最佳方法,我尝试修改最短路径遍历算法,如下所示:

def helper(dependencyDict, ChainsDict):path = []
    for key in dependencyDict:
        path = path + [(recursiveRowGen(dependencyDict,key))]
    for paths in path:
        ChainsDict[paths[0]] = paths[1:]
    print(finalLineDict)
def recursiveRowGen(dependencyDict,key,path = []):
    path = path + [key]

        if not key in dependencyDict:
        print("no key: ",key)
        return path
        print(dependencyDict[key])
        for blocking in dependencyDict[key]:
            if blocking not in path:
                newpath = recursiveRowGen(dependencyDict,blocking,path)
                if newpath:
                    return newpath             
    return path
但是,当dependecyDict中的键具有多个值时,此代码在捕获正确的输出时遇到问题。
我找到了一个老套的解决方案,但感觉不太优雅。感谢您的帮助,谢谢

这基本上是一个图遍历问题。您可以将每个键表示为图形中的一个节点,其值是它所连接的节点

可以对图形执行深度优先搜索或广度优先搜索。当然,每种方法都有一个迭代和递归的解决方案。下面是一个迭代实现(我添加了一些条件以消除循环):

结果如下:

{'A': ['D', 'C', 'B', 'E'], 'C': ['B', 'A', 'E', 'D'], 'B': ['A', 'E', 'D', 'C'], 'D': ['C', 'B', 'A', 'E'], 'G': ['H']}

下面是一个递归解决方案:

代码 输出:
{'A': ['D', 'C', 'B', 'E'], 'C': ['B', 'A', 'E', 'D'], 'B': ['A', 'E', 'D', 'C'], 'D': ['C', 'B', 'A', 'E'], 'G': ['H']}
def get_chain_d(argDict):
    def each_path(i,caller_chain):
        a=[]
        caller_chain.append(i)
        b = argDict.get(i,[])
        for j in b:
            if j not in caller_chain:
                a.append(j)
                a.extend(each_path(j,caller_chain))
        return a

    return {i:each_path(i,[]) for i in argDict}

dependecyDict = { 'A': ['D'], 'B': ['A', 'E'], 'C': ['B'], 'D': ['C'], 'G':['H']}

print(get_chain_d(dependecyDict))
{'B': ['A', 'D', 'C', 'E'], 'A': ['D', 'C', 'B', 'E'], 'D': ['C', 'B', 'A', 'E'], 'C': ['B', 'A', 'D', 'E'], 'G': ['H']}