图的遍历
图的遍历是图的操作算法中最基本也是最重要的方法,与树的遍历相似,这里也分为深度优先遍历和宽度优先遍历,通过深度优先遍历得到的顶点序列称为该图的深度优先序列(Depth-First Search,DFS序列),通过宽度优先遍历得到的顶点序列称为该图的宽度优先序列(Breadth-First Search,BFS序列)
Breadth-First Search
def BFS(graph,start):
queue = [start,]
visit = set()
visit.add(start)
parent = {start:None,}
while queue:
vertex = queue.pop(0)
print vertex
edges = graph[vertex]
for v in edges:
if v not in visit:
queue.append(v)
visit.add(v)
parent[v] = vertex
return parent
Depth-First Search,非递归方式:
def DFS(graph,start):
stack = [start,]
visit = set()
visit.add(start)
parent = {start:None,}
while stack:
vertex = stack.pop()
print vertex
edges = graph[vertex]
for v in edges:
if v not in visit:
stack.append(v)
visit.add(v)
parent[v] = vertex
return parent
Depth-First Search,递归方式:
def DFS2(graph,start):
def dfsRec(vertex,visited):
print vertex
edges = graph[vertex]
for v in edges:
if v not in visited:
visited.add(v)
dfsRec(v,visited)
visited = set()
visited.add(start)
dfsRec(start,visited)
运行结果:
g = {'A':{'B':1,'C':2},
'B':{'A':1,'C':3,'D':4},
'C':{'A':2,'B':3,'D':5,'E':6},
'D':{'B':4,'C':5,'E':7,'F':8},
'E':{'C':6,'D':7,'G':9},
'F':{'D':8},
'G':{'E':9}
}
print "BFS---"
print BFS(g,'A')
print "DFS---"
print DFS(g,'A')
print "REC---"
DFS2(g,'A')
runfile('/root/test/graph.py', wdir='/root/test')
BFS---
A
C
B
E
D
G
F
{'A': None, 'C': 'A', 'B': 'A', 'E': 'C', 'D': 'C', 'G': 'E', 'F': 'D'}
DFS---
A
B
D
F
E
G
C
{'A': None, 'C': 'A', 'B': 'A', 'E': 'D', 'D': 'B', 'G': 'E', 'F': 'D'}
REC---
A
C
B
D
E
G
F