图的遍历

102 篇文章 0 订阅
70 篇文章 0 订阅

图的遍历

图的遍历是图的操作算法中最基本也是最重要的方法,与树的遍历相似,这里也分为深度优先遍历和宽度优先遍历,通过深度优先遍历得到的顶点序列称为该图的深度优先序列(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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值