美文网首页
图的广度优先遍历和深度优先遍历

图的广度优先遍历和深度优先遍历

作者: 羲牧 | 来源:发表于2020-07-19 21:39 被阅读0次
# Definition for a Node.
class Node:
    def __init__(self, val = 0, neighbors = None):
        self.val = val
        self.neighbors = neighbors if neighbors is not None else []


def breadthFisrtSearch(source, target):
    if source == target:
        return
    queue = [source]
    is_visited = [source]
    prev = {}
    found = False

    result = []
    while len(queue):
        cur = queue.pop(0)
        for nei in cur.neighbors:
            if nei not in is_visited:
                prev[nei] = cur
                queue.append(nei)
                is_visited.append(nei)
                if nei.val == target.val:
                    p = nei
                    while p in prev:
                        result.append(p.val)
                        p = prev[p]
                    if p != nei:
                        result.append(p.val)
                    break
    print('result', result[::-1])
    

def depthFisrtSearch(source, target):
    found = [False]
    is_visited = []
    prev = {}

    dfs_helper(source, target, is_visited, prev, found)
    if found[0]:
        result = []
        p = target
        while p in prev:
            result.append(p.val)
            p = prev[p]
        if p != target:
            result.append(p.val)
        print('result', result[::-1])
    return False


def dfs_helper(s, target, is_visited, prev, found):
    if found[0]:
        return
    is_visited.append(s)
    if s.val == target.val:
        found[0] = True
        return
    for nei in s.neighbors:
        if nei not in is_visited:
            prev[nei] = s
            dfs_helper(nei, target, is_visited, prev, found)
    

if __name__ == '__main__':
    node1 = Node(1) 
    node2 = Node(2)  
    node3 = Node(3)   
    node4 = Node(4)   
    node5 = Node(5)             
    node6 = Node(6)   
    node1.neighbors = [node2, node3, node5]
    node2.neighbors = [node1, node4]
    node3.neighbors = [node1, node4, node5]
    node4.neighbors = [node2, node3, node6]
    node5.neighbors = [node1, node3, node6]
    node6.neighbors = [node4, node5]
    breadthFisrtSearch(node1, node6)


    depthFisrtSearch(node1, node6)
    







    





相关文章

网友评论

      本文标题:图的广度优先遍历和深度优先遍历

      本文链接:https://www.haomeiwen.com/subject/aworkktx.html