源点是S,求这个图广度优先遍历的结果
顶点类:
class Vertex(object):
def __init__(self,Name = 'unNamed',Deep = 0,Color = "white",Parent = None):
self.name = Name
self.deep = Deep
self.color = Color
self.parent = Parent
def __str__(self, *args, **kwargs):
return self.name
def __repr__(self, *args, **kwargs):
return self.__str__()
def print_info(self):
print("vertext:",self,",deep:",self.deep,",parent:",self.parent)
def main():
v = Vertex()
v.name = "v"
w = Vertex()
w.name = "w"
w.deep = 1
w.parent = v
edge = [v,w]
print ("edge:",edge)
for eachVertex in edge:
eachVertex.print_info()
if __name__ == "__main__":
main()
广度优先:
from vertex import Vertex
from collections import deque
class Graph(object):
def __init__(self):
#Adjs邻接表字典,数据结构:{Vertex1:[x,y,z], vertex2:[a,b,c,d],......}
#要访问某个顶点的所有邻居,Adjs[Vertex]
#返回为该顶点的邻居列表,如[v,x,y,z]
self.Adjs = {}
def addAdj(self,Vertex,*neighbors):
'添加邻接链表'
list = []
for neighbor in neighbors:
list.append(neighbor)
self.Adjs[Vertex] = list
def BFS(G,Root):
'广度优先'
Q = deque()#先进先出队列
Root.color = 'gray'
Q.append(Root)
while len(Q) != 0:
u = Q.popleft()
neighbors_of_u = G.Adjs[u]
for v in neighbors_of_u:
if v.color == 'white':
v.color = 'gray'
v.deep = u.deep + 1
v.parent = u
Q.append(v)
def main():
#初始化顶点
r = Vertex("r")
s = Vertex("s")
t = Vertex("t")
u = Vertex("u")
v = Vertex("v")
w = Vertex("w")
x = Vertex("x")
y = Vertex("y")
G = Graph()
#添加邻接链表
G.addAdj(s,r,w)
G.addAdj(r,v,s)
G.addAdj(t,w,x,u)
G.addAdj(u,t,x,y)
G.addAdj(v,r)
G.addAdj(w,s,t,x)
G.addAdj(x,w,t,u,y)
G.addAdj(y,x,u)
BFS(G,s)#广度优先
#打印遍历的结果
list = [r,s,t,u,v,w,x,y]
for each in list:
each.print_info()
if __name__ == "__main__":
main()
运行graph.py得结果:
vertext: r ,deep: 1 ,parent: s
vertext: s ,deep: 0 ,parent: None
vertext: t ,deep: 2 ,parent: w
vertext: u ,deep: 3 ,parent: t
vertext: v ,deep: 2 ,parent: r
vertext: w ,deep: 1 ,parent: s
vertext: x ,deep: 2 ,parent: w
vertext: y ,deep: 3 ,parent: x