
python图的深度优先和广度优先
从初始节点v开始标记其已访问。 查找v的第一个邻接节点w。 若w存在且未被访问,则继续深入;否则回溯到上一个节点,寻找下一个未被访问的邻接点。 访问w并标记为已访问,继续查找w的邻接节点wi。 重复上述过程直至所有节点均被访问。 将起始节点v入队列。 当队列不为空时,取出队头节点v,标记其已访问。 查找v的第一个邻接节点col。 若col未被访问且未入队,入队并标记已访问。 继续查找下一个未被访问的邻接节点 col,并执行步骤4。 当所有邻接节点处理完后,回到步骤2执行。
发布日期:2021-05-18 05:50:53
浏览次数:12
分类:精选文章
本文共 2481 字,大约阅读时间需要 8 分钟。
回溯法是一种选优搜索法,以达标为先,将不达标的路径及时回溯。结合图遍历,我们可以通过深度优先和广度优先两种算法实现对图结构的遍历。
深度优先算法
广度优先算法
代码示例
class Graph(object): def __init__(self, *args, **kwargs): self.node_neighbors = {} self.visited = {} def add_nodes(self, nodelist): for node in nodelist: self.add_node(node) def add_node(self, node): if not node in self.nodes(): self.node_neighbors[node] = [] def add_edge(self, edge): u, v = edge if v not in self.node_neighbors[u] and u not in self.node_neighbors[v]: self.node_neighbors[u].append(v) if u != v: self.node_neighbors[v].append(u) def nodes(self): return self.node_neighbors.keys() def depth_first_search(self, root=None): order = [] def dfs(node): self.visited[node] = True order.append(node) for n in self.node_neighbors[node]: if not n in self.visited: dfs(n) if root: dfs(root) for node in self.nodes(): if not node in self.visited: dfs(node) print("深度优先顺序:", order) return order def breadth_first_search(self, root=None): queue = [] order = [] def bfs(): while len(queue) > 0: node = queue.pop(0) self.visited[node] = True for n in self.node_neighbors[node]: if not n in self.visited and not n in queue: queue.append(n) order.append(n) if root: queue.append(root) order.append(root) bfs() for node in self.nodes(): if not node in self.visited: queue.append(node) order.append(node) bfs() print("广度优先顺序:", order) return order# 初始化图结构g = Graph()g.add_nodes([i+1 for i in range(8)])g.add_edge((1, 2))g.add_edge((1, 3))g.add_edge((2, 4))g.add_edge((2, 5))g.add_edge((4, 8))g.add_edge((5, 8))g.add_edge((3, 6))g.add_edge((3, 7))g.add_edge((6, 7))# 测试nodes: [1, 2, 3, 4, 5, 6, 7, 8]广度优先顺序: [1, 2, 3, 4, 5, 6, 7, 8]深度优先顺序: [1, 2, 4, 8, 5, 3, 6, 7]
以上内容通过深度优先算法和广度优先算法实现了对图的遍历。代码中图的节点及边的建立,结合遍历算法,展示了不同遍历顺序的结果。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年05月04日 20时20分50秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
2017CS231n笔记5.CNN
2019-03-15
Linux系统安装Nodejs
2019-03-15
vue项目报错集合
2019-03-15
图片链接
2019-03-15
LINUX-WIFI无线接入的一些东西
2019-03-15
word文档手写字母总会大写问题
2019-03-15
Redis中的key
2019-03-15
Andriod进阶之路 - DataBinding的简单使用
2019-03-15
juc-09-控制并发流程工具类
2019-03-15
第一节 docker安装
2019-03-15
Linux系统时间与硬件时间及时间同步
2019-03-15
Spring 和 DI 依赖注入
2019-03-15
中序线索二叉树的遍历
2019-03-15
文字策略游戏 android studio(学习intent,textview,等等)
2019-03-15
laravel server error 服务器内部错误
2019-03-15
17_注册Github账号
2019-03-15
Linux驱动实现GPIO模拟I2C读写操作
2019-03-15
iJ配置Maven环境详解
2019-03-15
仿QQ登陆界面
2019-03-15