广度优先

源点是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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值