图的基本算法——广度优先搜索和深度优先搜索

 

  图是一般用来定义对象之间的关系或联系的模型。在图的基本算法中,最基础的就是遍历算法。我们根据访问节点的顺序不同可分为广度优先搜索BFS和深度优先搜索DFS。

  简单来说,广度优先搜索的特点是在遍历图中顶点之前先访问当前顶点的所有邻接结点;深度优先搜索的特点是访问途中顶点后递归的访问此顶点的所有未访问过的相邻顶点。

  •  BFS的思路就是从初始顶点开始一直访问其所有的邻接顶点一直到终止,其算法利用了队列先进先出的思想。
  •  DFS的思路就是从顶点开始从一条路线访问下去直到终止,然后进行回溯到上一步,还一条路线访问下去同样直到终止。

 

     因为时间关系,我仅仅用python实现了BFS广度优先搜索。代码贴在下面,不难很简单就不解释了。

#-*- coding:utf-8 -*-
# 类似于树的层次遍历结构
"""
:type num: int 结点的个数
:type edges: List[List[int]] 
:rtype: List[int]
"""
import Queue

def bfs(num, edges, visited, start):
    queue = Queue.Queue() # 队列
    queue.put(start)
    visited[start] = 1
    while not queue.empty():
        front = queue.get()
        print front
        for i in range(num):
            if (not visited[i]) and ([i, front] in edges):
                queue.put(i)
                visited[i] = 1

     
if __name__ == '__main__':
    num = 5 # 结点个数
    edges = [[1,3],[2,3],[0,3],[0,1],[2,1],[1,2],[0,2],[0,4],[2,4]] # 结点的联系
    visited = [0 for n in range(num)] # 已经访问过的点
    for i in range(num):
        if visited[i] == 1:
            continue
        bfs(num, edges, visited, i)

P.S. edges数组中的元素表示的是结点与结点的联系,比如[1,3]表示的是结点3指向结点1。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值