《算法导论》BFS和DFS实现

本文详细介绍了广度优先搜索(BFS)与深度优先搜索(DFS)两种基本图搜索算法的原理及Python实现,通过具体代码示例展示了如何使用这两种算法进行图遍历。
部署运行你感兴趣的模型镜像
  1. 广度优先搜索BFS可以用在最小生成树算法(Prim)和单源最短路径算法(Dijkstra),借助优先队列存放同一深度的待访问结点
  2. 深度优先搜索DFS,本质是回溯算法,“一条路走到头再回来”

参考《算法导论》第六部分图算法的第22章-图的基本算法:

  1. 图G(V, E)用邻接矩阵G表示
  2. 用三种颜色标记顶点的状态,记录搜索轨迹(顶点未发现“white”,发现为“gray”,遍历完为“black”)
  3. 用数组colorparent表示各顶点的颜色状态和父节点

以下是BFS的python代码实现:

def BFS(G, s):
    """
        G: Adajcent Matrix
        s: The index of source node to traverse
    """
    # initialize
    numVertex = len(G)
    color = ['white']*numVertex
    level = ['inf']*numVertex
    parent = ['null']*numVertex

    color[s] = 'gray'
    level[s] = 0
    parent[s] = 0 
    queue = []  
    queue.append(s)

    while queue:
        u = queue.pop(0)
        print u
        # find adjacent node of u
        for v in xrange(numVertex):
            if G[u][v] == 0:
                continue
            if color[v] == 'white':
                queue.append(v)
                color[v] = 'gray'
                level[v] = level[u] + 1
                parent[v] = u
        color[u] = 'black'

    print 'level', level
    print 'color', color    
    print 'parent', parent

if __name__ == "__main__":
    G = [[1, 1, 0, 1, 0, 0],
         [1, 1, 0, 0, 1, 0],
         [0, 0, 1, 0, 1, 1],
         [1, 0, 0, 1, 0, 0],
         [0, 1, 1, 0, 1, 1],
         [0, 0, 1, 0, 1, 1]]
    BFS(G,2)

DFS的python实现

def DFS(G):
    """
        G: Adajcent Matrix
        s: The index of source node to traverse
    """
    numVertex = len(G)
    color = ['white']*numVertex
    parent = ['null']*numVertex

    for u in xrange(numVertex):
        if color[u] == 'white':
            DFS_VISIT(u, color, parent)

    print 'color', color
    print 'parent', parent

def DFS_VISIT(u, color, parent):
    color[u] = 'gray'
    print u 
    for v in xrange(len(color)):
        if G[u][v] == 0:
            continue
        if color[v] == 'white':
            parent[v] = u
            DFS_VISIT(v, color, parent)
    color[u] = 'black'

if __name__ == "__main__":
    G = [[1, 1, 0, 1, 0, 0],
         [1, 1, 0, 0, 1, 0],
         [0, 0, 1, 0, 1, 1],
         [1, 0, 0, 1, 0, 0],
         [0, 1, 1, 0, 1, 1],
         [0, 0, 1, 0, 1, 1]]
    DFS(G)

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值