图的遍历 bfs和dfs,利用bfs寻找最短路径

bfs(广度优先遍历)

在这里插入图片描述
在这里插入图片描述

可以看到从一点出发,依次遍历它的邻接节点

bfs图解过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看到通过队列先进先出的特性,可以完成无向图的bfs

实现代码

# 用一个字典来表示无向图,节点为key,邻接点组成的list为value
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'C', 'D'],
    'C': ['A', 'B', 'D', 'E'],
    'D': ['B', 'C', 'E', 'F'],
    'E': ['C', 'D'],
    'F': ['D']
}


def bfs(graph: dict, start_point):
    """
    :param graph: 传进来的图
    :param start_point: 起始节点
    :return:
    """
    queue = []
    queue.append(start_point)
    # 储存已经访问过的节点
    seen = set()
    seen.add(start_point)
    while len(queue) > 0:
        point = queue.pop(0)
        nodes = graph[point]
        for node in nodes:
            # 如果这个节点没有被访问过
            if node not in seen:
                queue.append(node)
                seen.add(node)
        print(point)

利用bfs寻找最短路径

在这里插入图片描述

# 用一个字典来表示无向图,节点为key,邻接点组成的list为value
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'C', 'D'],
    'C': ['A', 'B', 'D', 'E'],
    'D': ['B', 'C', 'E', 'F'],
    'E': ['C', 'D'],
    'F': ['D']
}

def find_shortest_path(graph: dict, start_point):
    """
    :param graph: 传进来的图
    :param start_point: 起始节点
    :return:
    """
    queue = []
    queue.append(start_point)
    # 储存已经访问过的节点
    seen = set()
    seen.add(start_point)
    # 存储上一个节点
    parent = {start_point: None}

    while len(queue) > 0:
        point = queue.pop(0)
        nodes = graph[point]
        for node in nodes:
            # 如果这个节点没有被访问过
            if node not in seen:
                queue.append(node)
                seen.add(node)
                parent[node] = point
        # print(point)
    return parent

if __name__ == '__main__':
    parent_dict = find_shortest_path(graph, "A")
    end = "E"
    while end != None:
        print(end, end='<-')
        end = parent_dict[end]

通过记录每个节点的父节点,倒推即可得到上一个节点即可得到图的最短路径

dfs(深度优先遍历)

在这里插入图片描述

从一个节点一路走到黑

dfs图解

在这里插入图片描述
在这里插入图片描述

利用栈先进后出的特性,完成对图的深度优先遍历

实现代码

graph = {
    'A': ['B', 'C'],
    'B': ['A', 'C', 'D'],
    'C': ['A', 'B', 'D', 'E'],
    'D': ['B', 'C', 'E', 'F'],
    'E': ['C', 'D'],
    'F': ['D']
}
def dfs(graph: dict, start_point):
    """
    :param graph: 传进来的图
    :param start_point: 起始节点
    :return:
    """
    stack = []
    stack.append(start_point)
    # 储存已经访问过的节点
    seen = set()
    seen.add(start_point)
    while len(stack) > 0:
        point = stack.pop()
        nodes = graph[point]
        for node in nodes:
            # 如果这个节点没有被访问过
            if node not in seen:
                stack.append(node)
                seen.add(node)
        print(point)
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值