BFS图遍历:Leetcode 133. 克隆图

各种逻辑漏洞 注册:短信轰炸验证码安全问题密码爆破邮箱轰炸用户任意注册、批量注册用户名枚举XSS(有框的地方就可以尝试插XSS)登录:短信轰炸、验证码安全问题、密码爆破、邮箱轰炸SQL注入撞库抓包把password字段修改为空值发送认证凭证替换、比如返回的数据包中包含账号,修改账号就能登录到其他账号Cookie仿冒修改返回包的相关数据,可能会登陆到其他的用户找回密码:短信邮箱轰炸、短信邮箱劫持重置任意用户账户密码、验证码手机用户未统一验证直接跳过验证步骤。 阅读详情

1.题目描述

链接:https://leetcode.cn/problems/clone-graph/

class Node:
    def __init__(self, val = 0, neighbors = None):
        self.val = val
        self.neighbors = neighbors if neighbors is not None else []
        
class Solution:
    def cloneGraph(self, node: 'Node') -> 'Node':
        # your code

克隆一个用邻接表存储的图。输入为图的一个节点,包含值val和一个存储所有邻居节点的列表neighbors,输出为克隆之后的的输入节点。
在这里插入图片描述

2.图的BFS遍历

想要解决这道题,首先得知道图的BFS遍历,下面给出图BFS遍历的模板,理解记忆即可:

    def bfs_graph_templete(self, root: Node) -> List[Node]:
        """
        这里获取所有图中与root联通的节点,无序
        """
        if not root:
            return []
        queue = collections.deque([root])
        visited = set([root])  # 记录已经访问的节点

        while queue:
            node = queue.popleft()  
            # 将节点出队后,进行处理
            # ...
            for neighbor in node.neighbors:
                if neighbor in visited:
                    continue
                visited.add(neighbor)
                queue.append(neighbor)
        return list(visited)

可以看到,通过一个集合visited来存储已经访问过的节点,且只将未访问的节点加入队列queue,避免死循环。加入queue表示存储在队列中之后将会被访问,为此加入队列的同时将节点标记为已访问。
通过一下示例代码可以得到包含节点1,2,3,4的简单图的所有节点。
在这里插入图片描述

if __name__ == '__main__':
	node1 = Node(1)
    node2 = Node(2)
    node3 = Node(3)
    node4 = Node(4)

    node1.neighbors.append(node2)
    node1.neighbors.append(node4)
    node2.neighbors.append(node1)
    node2.neighbors.append(node3)
    node3.neighbors.append(node2)
    node3.neighbors.append(node4)
    node4.neighbors.append(node1)
    node4.neighbors.append(node3)

    root = node1
    nodes = bfs_graph_templete(root)
    res = [node.val for node in nodes]
    print(res)
# outputAA
[3, 4, 2, 1]

3.解法一:BFS边遍历边复制

通过BFS按层遍历节点,使用字典visited存储已访问节点并保存原始节点与拷贝节点的对应关系。找到一个节点后,也就得到了它的邻居节点,再得到对应的拷贝节点,就可以将边复制到拷贝的图中。要注意的是,访问过的邻居不能直接跳过,因为它还是其他节点的邻居。

class Solution:
    def cloneGraph(self, node: 'Node') -> 'Node':
        if not node:
            return None

        root = Node(node.val)
        queue = collections.deque([node])
        visited = {node: root}
        while queue:
            node_cur = queue.popleft()
            node_cpy = visited[node_cur]
            for neighbor in node_cur.neighbors:
                if neighbor not in visited:
                    neighbor_cpy = Node(neighbor.val)
                else:
                    neighbor_cpy = visited[neighbor]
                # process
                node_cpy.neighbors.append(neighbor_cpy)
                if neighbor not in visited:
                    visited[neighbor] = neighbor_cpy 
                    queue.append(neighbor)
        return root

4.解法二:BFS复制所有节点,再复制所有边

这种解法先获取所有的节点,再对所有的节点进行复制,并保留对应关系,最后根据原始图的边,在克隆图中添加边。低耦合、清晰的解法,值得学习。

class Solution:
    def cloneGraph(self, node: 'Node') -> 'Node':
        if not node:
            return None
        nodes = self.find_all_nodes(node)
        mapping = self.copy_nodes(nodes)
        self.copy_edges(nodes, mapping)
        return mapping[node]
    
    def find_all_nodes(self, root):
    	"""
    	找到所有的节点,无序
    	"""
        if not root:
            return []
        
        queue = collections.deque([root])
        visited = set([root])
        while queue:
            node = queue.popleft()
            for neighbor in node.neighbors:
                if neighbor in visited:
                    continue
                visited.add(neighbor)
                queue.append(neighbor)
        return list(visited)
    
    def copy_nodes(self, nodes):
    	"""
    	复制所有的节点
		"""
        mapping = {}
        for node in nodes:
            mapping[node] = Node(node.val)
        return mapping
    
    def copy_edges(self, nodes, mapping):
    	"""
    	复制所有的边
		"""
        for node in nodes:
            for neighbor in node.neighbors:
                mapping[node].neighbors.append(mapping[neighbor])
        
从零开始:手把手教你用VOACAP软件预测短波最佳工作频率(OWF) 本文详细介绍了如何使用VOACAP软件预测短波通信的最佳工作频率(OWF),涵盖软件安装、参数配置、电离层模型设置及结果解读。通过实战案例和优化技巧,帮助用户掌握短波传播特性,提升通信效率。特别适合业余无线电爱好者和专业通信人员参考。 阅读详情

相关推荐

CentOS Stream 9中安装MySQL的详细步骤

本文详细介绍了在CentOS Stream 9系统中如何进行MySQL的在线安装、离线安装以及忘记密码的恢复操作。通过阅读本文,您将能够了解并掌握在CentOS Stream 9上安装MySQL的步骤,以及在遇到忘记密码的情况下的解决方案。

小白典的博客 7255

图遍历算法 DFS/BFS 实战:3种邻接表实现与LeetCode 133题解

本文深入探讨图遍历算法DFS和BFS的实战应用,详细解析3种邻接表实现方式,并通过LeetCode 133题'克隆图'的题解展示深度优先遍历和广度优先遍历的核心技巧。内容涵盖递归与非递归实现、性能对比及工程优化建议,帮助开发者掌握图算法的关键应用场景与优化策略。

weixin_30274627的博客 372

从流体力学到深度学习:手把手教你用PINN预测涡流场(基于TensorFlow2.10+GPU)

本文详细介绍了如何利用物理信息神经网络(PINN)结合TensorFlow 2.10和GPU加速,预测Navier-Stokes方程的涡流场。通过核心原理讲解、实战环境配置、网络架构设计及物理约束实现,帮助读者掌握从流体力学到深度学习的跨学科技术应用,特别适合处理复杂流体问题和非定常流动场景。

weixin_29048309的博客 211

【Leetcode】图的多源BFS详解

对于Tree的BFS(典型的「单源 BFS」)大家都比较熟悉:首先把root节点入队,再一层一层无脑遍历就行了。 对于图的BFS(「多源 BFS」)也是一样,与Tree的BFS的区别如下: Tree只有1个root,而图可以有多个源点,所以首先需要把多个源点都入队。 Tree是有向的因此不需要标识是否访问过,而对于无向图来说,必须得标志是否访问过哦!并且为了防止某个节点多次入队,需要在其入队之前就将其设置成已访问! 下面通过几道leetcode题目的练习来掌握图的多源BFS的使用。 话不多说,进

小朱小朱绝不认输的博客 2275

【搭建实战】全国天气预报看板搭建

不仅如此,码匠还一站式提供了企业内部系统常用的租户管理、细粒度的权限控制、审计日志等功能,让您快速搭建后台应用的同时,也为您的企业信息安全保驾护航。是一款国内研发的开发者友好的低代码平台,您无需了解React/Vue等框架的开发、部署等各种细节,就可以快速打通前后端,连接RESTAPI、MySQL、MongoDB等多种数据源,然后通过一套开箱即用的组件,轻松搭建功能完善的数据看板、数据洞察、Admin管理后台等多种应用。天气预报对我们的各项活动有很大的帮助,可以让我们合理安排自己的出行等活动。...

weixin_39545889的博客 425

BIOS/UEFI完全指南:从开机自检到超频魔改的底层硬件控制

计算机启动过程始于固件层,其核心是负责硬件初始化与引导的系统软件。传统BIOS基于16位实模式,寻址能力有限,而现代UEFI采用保护模式,支持图形界面与安全启动,实现了从概念到架构的革新。这一演进带来了显著的技术价值:更快的启动速度、更强的安全性以及对大容量存储设备的原生支持。在工程实践中,无论是解决“虚拟化技术禁用”问题、调整内存XMP配置以提升性能,还是为老主板“魔改”添加NVMe支持,都需要深入理解并操作BIOS/UEFI设置。掌握这些底层交互能力,是进行硬件调试、系统优化与故障排查的关键,也是连接抽

weixin_34236869的博客 456

Leetcode刷题(第133题)——克隆图

一、题目 二、示例 输入:adjList = [[2,4],[1,3],[2,4],[1,3]] 输出:[[2,4],[1,3],[2,4],[1,3]] 解释: 图中有 4 个节点。 节点 1 的值是 1,它有两个邻居:节点 2 和 4 。 节点 2 的值是 2,它有两个邻居:节点 1 和 3 。 节点 3 的值是 3,它有两个邻居:节点 2 和 4 。 节点 4 的值是 4,它有两个邻居:节点 1 和 3 。 输入:adjList = [[]] 输出:[[]] 解释:输入包含一个空列表。该图仅仅

weixin_47450807的博客 489

ptrade从零开始学习量化交易第166期【ptrade量化策略研究参考--三个因子挖掘思路】

三个因子挖掘思路

GJ57017_wx的博客 1245

leetcode1129题(图的BFS)

leetcode1129题

weixin_44247784的博客 298

KUKA机器人修改机器人名称和IP地址的具体方法示例

KUKA机器人修改机器人名称和IP地址的具体方法示例

Robot_PLC_HMI_Automation 5257

TensorRT - 使用自定义层扩展 TensorRT

TensorRT 支持通过自定义插件扩展功能。开发者可以基于 IPluginV3 接口实现插件类,并通过 IPluginCreatorV3One 创建器类注册到 TensorRT 插件注册表。插件实现需要包含核心、构建和运行时三种能力,并通过静态或动态方式注册。最后可使用 addPluginV3() 将插件实例添加到 TensorRT 网络中。这种方法允许在标准层不满足需求时,使用自定义层扩展模型功能。

1147

[LeetCode]133. 克隆图(java实现)dfs+哈希表

[LeetCode](java实现)1. 题目2. 读题(需要重点注意的东西)3. 解法4. 可能有帮助的前置习题5. 所用到的数据结构与算法思想6. 总结 1. 题目 2. 读题(需要重点注意的东西) 思路(): 3. 解法 ---------------------------------------------------解法---------------------------------------------------: 可能存在的问题: 4. 可能有帮助的前置习题 5. 所用到的数据结

cloud的博客 674

Obsidian与RAG:知识管理的未来之战

摘要: 本文对比了传统RAG、Obsidian和llm-wiki-skill三种知识管理方案。传统RAG依赖查询时临时检索,知识无法积累;Obsidian需人工整理,成本高但结构化强;llm-wiki-skill通过AI在摄入时自动编译知识为结构化Wiki,实现持续增值。核心差异在于知识处理时机——llm-wiki-skill将"查询时检索"转变为"摄入时编译",通过三层Markdown结构(sources/concepts/entities)和自动双向链接构建可进化

ZhangJiqun&191cm&85kg 614

Java实现 LeetCode 133 克隆图

133. 克隆图 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。 class Node { public int val; public List<Node> neighbors; } 测试用例格式: 简单起见,每个节点的值都和它的索引相同。例如,第一个节...

南 墙 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【经典算法】LeetCode133克隆图(Java/C/Python3实现含注释说明,中等)

方式优点缺点时间复杂度空间复杂度DFS直观易理解可能需要较多递归调用栈空间O(V + E)O(V)BFS层次遍历需要额外维护队列O(V + E)O(V)

1497

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

leetcode133. 克隆图/bfs,dfs

文章目录题目:leetcode133. 克隆图基本思想:bfs 题目:leetcode133. 克隆图 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。 class Node { public int val; public List<Node> neighbors; } 测试用例格式: 简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1

yyf_blog 507

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

LeetCode 133. 克隆图:两种解法(BFS+DFS)详细解析

本文介绍了LeetCode中等难度题目「133. 克隆图」的两种解法。题目要求对无向连通图进行深拷贝,核心难点在于避免重复克隆节点和正确处理邻接关系。文章提出使用哈希表记录原节点与克隆节点的映射关系,并详细讲解了BFS(广度优先搜索)和DFS(深度优先搜索)两种实现方法。BFS采用迭代方式,通过队列逐层处理节点;DFS采用递归方式,代码更简洁。两种解法的时间复杂度均为O(N),空间复杂度为O(N)。最后对比了两种解法的适用场景,并强调了哈希表记录映射和边界处理等关键注意事项。

2401_86788218的博客 792

LeetCode第 133 题:克隆图(C++)

133. 克隆图 - 力扣(LeetCode) 读懂题目就够呛。。。 bfs: class Solution { public: Node* cloneGraph(Node* node) { if(!node) return NULL; //vector<bool> visited(110, false); unordered_map<Node*, Node*> visited; queue<Node*

zj 447

Leetcode 133. 克隆图 C++

Leetcode 133. 克隆图 题目 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。 class Node { public int val; public List<Node> neighbors; } 测试用例格式: 简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例

weixin_43750513的博客 340

LeetCode 力扣 133. 克隆图 cloneGraph

大家觉得写还可以,可以点赞、收藏、关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录133. 克隆图题目描述示例示例 1:示例 2:示例 3:示例 4:提示:分析DFSBFS提交结果 133. 克隆图 题目描述 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。 class Node { public int

motongxue的博客 353

leetcode133. 克隆图(图的遍历)

传送门 题目:给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。 class Node { public int val; public List<Node> neighbors; } 简单起见,每个节点的值都和它的索引相同。 例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。 给定节点将始终是图中

lonelyVM的博客 261

Leetcode 133.克隆图

Time: 20190903 Type: Medium 题目描述 给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆)。图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[Node])。 示例: 输入: {"$id":"1","neighbors":[{"$id":"2","neighbors":[{"$ref":"1"}, {"$id":"3","neighbors":...

Bing's Blog 423

Grind75第10天 | 133.克隆图、994.腐烂的橘子、79.单词搜索

然后进行 BFS 遍历,对上、下、左、右四个方向的结点进行污染,同时加入队列,作为第1层的节点。这个题和【542.01矩阵】有点像,都是先把某个特定值的点加入到队列中,作为第0层,然后进行广度优先搜索,遍历第1层,第2层...DFS:从A开始克隆,遍历两个邻居B和D,遍历到B时,不管D了,继续遍历B的邻居A和C。其中A遍历过了,跳过。BFS:从A开始克隆,遍历两个邻居B和D,B和D都遍历完了,再遍历B的邻居A和C。BFS 结束后,新鲜橘子的数量仍未减为零,说明存在无法被污染的橘子,返回为-1,否则分钟数。

Jack199274的博客 1151

LeetCode 133. 克隆图 | Python

使用深度优先搜索、广度优先搜索的思路,解决 LeetCode 《133. 克隆图》问题

"大梦三千秋的博客 754

图论专题(五):图遍历的“终极考验”——深度「克隆图」

今天,我们用“克隆图”这道题,将“图遍历”的理解,提升到了“状态管理”的层面。我们明白了,visited不仅仅是一个bool,它可以是一个哈希表,用来存储我们“已经处理过的子问题的答案这,其实已经触及到了“记忆化搜索” (Memoization) 的本质,也是动态规划思想在图论中的一种完美体现。在下一篇中,我们将把今天学到的 DFS/BFS,应用到最常见的“隐式图”——二维网格(“岛屿问题”)上!下期见!

2301_80334067的博客 1038

LeetCode - 133. 克隆图

133. 克隆图 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。 解题思路: 解决问题我们首先要想清楚一点,即我们解决问题的目标是什么,也就是说解决问题的终点,解决到什么程度就认为问题解决完了。解此题也是一样的,怎么样就可以认为克隆图完毕呢,将克隆的节点new完,并且将这个节点的neig...

virgilshi的博客 273
上一篇: 必刷?704. 二分查找 以及两种变体
下一篇: LeetCode刷题目录
von Libniz
博客等级 码龄8年 421粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值