python 图 深度广度优先

# coding=utf8
from collections import deque


# 深度优先遍历
G = [
    {1, 2, 3},     # 0
    {0, 4, 6},     # 1
    {0, 3},        # 2
    {0, 2, 4},     # 3
    {1, 3, 5, 6},  # 4
    {4, 7},        # 5
    {1, 4},        # 6
    {5, }
]

print G

# 递归深度优先
# 深度优先是一次访问到底,知道没有连接的顶点,再逐级返回,再逐级访问
def dfs(G, v, visited=set()):
    print v
    visited.add(v)  # 用来存放已经访问过的顶点
    # G[v] 是这个顶点的相邻的顶点
    for u in G[v]:
        # 这一步很重要,否则就进入了无限循环,只有这个顶点没有出现在这个集合中才会访问
        if u not in visited:
            dfs(G, u, visited)

# 迭代深度优先
def dfs_iter(G, v):
    visited = set()
    s = [v]
    while s:
        u = s.pop()
        if u not in visited:
            print u
            visited.add(u)
            s.extend(G[u])

dfs_iter(G, 0)



# 广度优先遍历
# 广度优先是,从某一个顶点出发,先访问一步能够到达的顶点,再访问两步能够达到的顶点,以此类推
def bfs(G, v):
    q = deque([v])
    # 同样需要申明一个集合来存放已经访问过的顶点,也可以用列表
    visited = {v}
    while q:
        u = q.popleft()
        print u
        for w in G[u]:
            if w not in visited:
                q.append(w)
                visited.add(w)

print "BFS"
bfs(G, 0)




# dfs(G, 0)

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值