前言:
菜鸟学算法。加油!
一、什么是DFS和BFS?
1、BFS算法:
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。
2、DFS算法:
事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.
深度优先遍历图的方法是,从图中某顶点v出发:
(1)访问顶点v;
(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。
二、用python实现BFS以及DFS算法:
1、BFS:
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,s): #s表示开始结点,广度优先算法依靠队列
queue=[]#python数组中可以动态添加和删除东西
#queue.append('A'),A加入数组,queue.pop('A'),A退出数组。
queue.append(s)#开始结点入队
seen=[]
seen.append(s)
while (len(queue)>0):
vertex=queue.pop(0)
nodes=graph[vertex]
for w in nodes:
if w not in seen:
queue.append(w)
seen.append(w)
print(vertex)
BFS(graph,'A')
2、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,s):
stack=[] #栈
stack.append(s)
seen=set()
seen.add(s)
while (len(stack)>0):
vertex=stack.pop()
nodes=graph[vertex]
for w in nodes:
if w not in seen:
stack.append(w)
seen.add(w)
print(vertex)
DFS(graph,'A')#起点任选