博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图的基本算法——广度优先搜索和深度优先搜索
阅读量:4089 次
发布时间:2019-05-25

本文共 1082 字,大约阅读时间需要 3 分钟。

 

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

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

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

 

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

#-*- coding:utf-8 -*-# 类似于树的层次遍历结构""":type num: int 结点的个数:type edges: List[List[int]] :rtype: List[int]"""import Queuedef 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。

 

 

转载地址:http://vhyii.baihongyu.com/

你可能感兴趣的文章
VUE面试题总结
查看>>
写好JavaScript条件语句的5条守则
查看>>
原生JS中DOM节点相关API合集
查看>>
【TINY4412】U-BOOT移植笔记:(7)SDRAM驱动
查看>>
【TINY4412】U-BOOT移植笔记:(12)BEEP驱动
查看>>
单链表的修改和删除
查看>>
C++的三个基本特征:封装、继承、多态
查看>>
C++虚函数的总结
查看>>
什么是URL地址?
查看>>
C++多态的实现方式总结
查看>>
学习C++需要注意的问题
查看>>
C++模板
查看>>
C++双冒号(::)的用法
查看>>
【Unity】封装SQLite管理类
查看>>
【Unity】面试题整理
查看>>
【C#】如何实现一个迭代器
查看>>
【Unity】Destroy和DestroyImmediate的区别
查看>>
【Lua】Mac系统下配置SublimeText的Lua编译环境
查看>>
【C#】利用Conditional属性完成编译忽略
查看>>
【Unity】微信登录后将头像存为bytes,将bytes读取成sprite图片
查看>>