shortest path from goal to root in directed graph with cycles python

时间秒杀一切 提交于 2019-12-02 09:52:38

Just find the paths and then invert them.

UPDATED: Added "[]" to "DEADEND" and "GOAL" in end conditions.

import copy as cp

DCT = {...}  # You already know what goes here. 

FOUND_PATHS = []            # In case of more than one path to GOAL.
FOUND_REVERSE_PATHS = []

COUNTER = len(DCT)

def back_track(root, target_path = [], counter=COUNTER):
    """
    @param root: DCT key.
    @type root: str.

    @param target_path: Reference to the path we are constructing.
    @type target_path: list.

    """
    global FOUND_PATHS

    # Avoiding cycles.
    if counter == 0:
        return

    # Some nodes aren't full generated.
    try:
        DCT[root]
    except KeyError:
        return

    # End condition.
    if DCT[root] == ['DEADEND']:
        return
    # Path found.
    if DCT[root] == ['GOAL']:
        FOUND_PATHS.append(target_path)             # The normal path.
        reverse_path = cp.copy(target_path)
        reverse_path.reverse()
        FOUND_REVERSE_PATHS.append(reverse_path)     # The path you want.
        return

    for node in DCT[root]:
        # Makes copy of target parh and add the node.
        path_copy = cp.copy(target_path)
        path_copy.append(node)
        # Call back_track with current node and the copy 
        # of target_path.
        back_track(node, path_copy, counter=(counter - 1))

if __name__ == '__main__':
    back_track('4345092')
    print(FOUND_PATHS)
    print(FOUND_REVERSE_PATHS) 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!