图的遍历(Python实现)

记录两种图的遍历算法——广度优先(BFS)与深度优先(DFS)。

图(graph)在物理存储上采用邻接表,而邻接表是用python中的字典来实现的。

两种遍历方式的代码如下所示:

# 图的宽度遍历和深度遍历

# 1. BFS
def bfsTravel(graph, source):
# 传入的参数为邻接表存储的图和一个开始遍历的源节点
frontiers = [source] # 表示前驱节点
travel = [source] # 表示遍历过的节点
# 当前驱节点为空时停止遍历
while frontiers:
nexts = [] # 当前层的节点(相比frontier是下一层)
for frontier in frontiers:
for current in graph[frontier]: # 遍历当前层的节点
if current not in travel: # 判断是否访问过
travel.append(current) # 没有访问过则入队
nexts.append(current) # 当前结点作为前驱节点
frontiers = nexts # 更改前驱节点列表
return travel def dfsTravel(graph, source):
# 传入的参数为邻接表存储的图和一个开始遍历的源节点
travel = [] # 存放访问过的节点的列表
stack = [source] # 构造一个堆栈
while stack: # 堆栈空时结束
current = stack.pop() # 堆顶出队
if current not in travel: # 判断当前结点是否被访问过
travel.append(current) # 如果没有访问过,则将其加入访问列表
for next_adj in graph[current]: # 遍历当前结点的下一级
if next_adj not in travel: # 没有访问过的全部入栈
stack.append(next_adj)
return travel if __name__ == "__main__":
graph = {}
graph['a'] = ['b']
graph['b'] = ['c','d']
graph['c'] = ['e']
graph['d'] = []
graph['e'] = ['a'] # test of BFS
print(bfsTravel(graph, 'b')) print(dfsTravel(graph, 'b'))

运行结果如下:

['b', 'c', 'd', 'e', 'a']
['b', 'd', 'c', 'e', 'a']

图的遍历(Python实现)的更多相关文章

  1. python 回溯法 子集树模板 系列 —— 8、图的遍历

    问题 一个图: A --> B A --> C B --> C B --> D B --> E C --> A C --> D D --> C E -- ...

  2. 图的遍历算法:DFS、BFS

    在图的基本算法中,最初需要接触的就是图的遍历算法,根据访问节点的顺序,可分为深度优先搜索(DFS)和广度优先搜索(BFS). DFS(深度优先搜索)算法 Depth-First-Search 深度优先 ...

  3. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  4. 以图搜图(一):Python实现dHash算法(转)

    近期研究了一下以图搜图这个炫酷的东西.百度和谷歌都有提供以图搜图的功能,有兴趣可以找一下.当然,不是很深入.深入的话,得运用到深度学习这货.Python深度学习当然不在话下. 这个功能最核心的东西就是 ...

  5. C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)

    图的存储结构 1)邻接矩阵 用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中边或弧的信息. 2)邻接表 3)十字链表 4)邻接多重表 5)边集数组 本文只用代码实现用 ...

  6. Kruskal和prime算法的类实现,图的遍历BFS算法。

    一.图的遍历 #include<iostream> #include<queue> #include<vector> using namespace std; in ...

  7. 图的遍历——DFS(矩形空间)

    首先,这里的图不是指的我们一般所说的图结构,而是大小为M*N的矩形区域(也可以看成是一个矩阵).而关于矩形区域的遍历问题经常出现,如“寻找矩阵中的路径”.“找到矩形区域的某个特殊点”等等之类的题目,在 ...

  8. 图的遍历——DFS和BFS模板(一般的图)

    关于图的遍历,通常有深度优先搜索(DFS)和广度优先搜索(BFS),本文结合一般的图结构(邻接矩阵和邻接表),给出两种遍历算法的模板 1.深度优先搜索(DFS) #include<iostrea ...

  9. 15 图-图的遍历-基于邻接矩阵实现的BFS与DFS算法

    算法分析和具体步骤解说直接写在代码注释上了 TvT 没时间了等下还要去洗衣服 就先不赘述了 有不明白的欢迎留言交流!(估计是没人看的了) 直接上代码: #include<stdio.h> ...

随机推荐

  1. WebLogic配置与部署

    一.创建域: 第一步,选择“开始菜单”-> “Oracle WebLogic”-> “WebLogic Server 10gR3” -> “Tools”-> “Configur ...

  2. Business Component(BC)和Business Object(BO)

    Siebel应用架构的一个成功的地方就是在应用里引入了BC,BO的概念,从而使得几千张关系数据表能够按照业务的含义组织成业务对象,对于业务人员而言具有了业务上的含义,而不仅仅是从技术人员的观点来对待数 ...

  3. ORACLE查询删除重复记录三种方法

    本文列举了3种删除重复记录的方法,分别是rowid.group by和distinct,小伙伴们可以参考一下.   比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完 ...

  4. 服务器ipmi远程管理

    DELL iDRAC (Integrated Dell™ Remote Access Controller )是 Dell PowerEdge 系列服务器上的远程管理方案, 11代 12代服务器已经集 ...

  5. Android(java)学习笔记8:同步代码块 和 同步方法 的应用

    1. 同步代码块 和 同步方法 代码示例: (1)目标类,如下: package cn.himi.text; public class SellTicket implements Runnable { ...

  6. 2018.9.16 Redis 边学习边总结

    Redis 是一个使用 C 语言写成的,开源的 key-value 数据库..和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合) ...

  7. maven学习记录四——私服 nexus

    8       私服 nexus 安装nexus 启动服务 启动失败的解决方法: 登录nexus 用户名/密码  admin/admin123 仓库类型 Virtual   虚拟仓库 Proxy  代 ...

  8. springmvc时间(date)无法转入后台(@DateTimeFormat+@JsonFormat(GMT+8))

    spring时间(date)无法转入后台 Type Status Report Description The server cannot or will not process the reques ...

  9. 运行出现Server Tomcat v8.5 Server at localhost failed to start.和A child container failed during start

    出现问题: 解决方法: 1.看servlet文件中的@WebServlet“()”,里面是否少了/字符,如图: 加上即可,有问题随时留言,欢迎您的咨询!

  10. P2852 [USACO06DEC]牛奶模式Milk Patterns

    link 这是一道后缀匹配的模板题 我们只需要将height算出来 然后二分一下答案就可以了 #include<cstdio> #include<algorithm> #inc ...