对于深度优先搜索(DFS)、广度优先搜索(BFS)的代码实现一直都有困惑,今天看了相关算法的讲解,用python来实现一下BFS和DFS,并进行扩展,包括使用BFS对无权无向图求解最短路径,以及对带权无向图求解最短路径的Dijkstra算法(BFS的扩展)进行解读。
BFS与DFS基础
重点:对于BFS,使用队列queue来存储待访问的节点;对于DFS,使用栈stack来存储待访问的节点;
1 | graph = { |
无权无向图求解最短路径
使用BFS的思想,求每个节点的上一个节点所构成的parent字典,然后从终点往前搜索,直到起点位置,从而得到最终的最短路径。
分析:为什么基于BFS可以求解这个问题?因为当前图为无权图,所以要求起点到终点的最短路径,即起点到终点每走一步则跨过一层。因此我们的目标是去判断每个节点属于第几层。而BFS的思想就是一层一层的遍历图。而且每个节点都与上面一层的一个和几个节点连接,在BFS中访问过的节点就不重新访问,所以最终遍历时每个节点只有一个上层直接相连的节点,因此我们可以用dict来存储每个节点的上层节点,保存为parent,如果终点为“E”,则其上一个节点即为上一层,以此往上推,则可以达到起点,这种方式能够保证每次走一层,而不会在同一层走多次导致最终的结果不是最短路径。这就是BFS所隐含的效果。
1 | graph = { |
带权无向图求解最短路径(Dijkstra)
1 | import heapq |