Clone Graph BFS & DFS

本文介绍了一种基于深广度优先搜索的图克隆算法,该算法能够有效处理图中存在的环问题。通过使用unordered_map记录原始节点与克隆节点之间的对应关系,避免重复克隆。此外,文章提供了DFS和BFS两种实现方式的具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

变量unordered_map cloneMap;

因为会有环,所以需要cloneMap记录旧的节点和新的节点对。

还需要一个visited记录已经访问过的节点,可以和cloneMap合并在一起。


DFS:

在克隆某个Node时,首先放入map中。

之后遍历neighbors。如果neighbors不在map里,即没有访问过,则递归调用cloneGraph函数。

最后返回克隆过的节点。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
     if (node == NULL) return NULL;
     if (cloneMap.find(node) != cloneMap.end())
         return cloneMap[node];
     cloneMap[node] = new UndirectedGraphNode(node->label);
     cloneMap[node]->neighbors = vector<undirectedgraphnode *= "" >();
     for ( int i = 0 ; i < node->neighbors.size(); i++)
     {
         UndirectedGraphNode * curNode = node->neighbors[i];
         UndirectedGraphNode * newNode = cloneGraph(curNode);
         cloneMap[node]->neighbors.push_back(newNode);
     }
     return cloneMap[node];
}</undirectedgraphnode>

BFS:

使用一个queue记录要访问的节点。

因为不能在访问queue中节点的时候再创建对应的node==>因为在处理父亲节点的时候需同时创建好其neighbors

所以需要在将不在map中的neighbors(没有访问过的子节点)放入queue的同时创建克隆的节点,并且放入map里。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
     if (node == NULL) return NULL;
     vector<undirectedgraphnode *= "" > queue;
     queue.push_back(node);
     cloneMap[node] = new UndirectedGraphNode(node->label);
     cloneMap[node]->neighbors = vector<undirectedgraphnode *= "" >();
     
     for ( int i = 0 ; i < queue.size(); i++)
     {
         UndirectedGraphNode * newNode = cloneMap[queue[i]];
         for ( int j = 0 ; j < queue[i]->neighbors.size(); j++)
         {
             UndirectedGraphNode * curNb = queue[i]->neighbors[j];
             if (cloneMap.find(curNb) == cloneMap.end())
             {
                 queue.push_back(curNb);
                 UndirectedGraphNode * newNb = new UndirectedGraphNode(curNb->label);
                 newNb->neighbors = vector<undirectedgraphnode *= "" >();
                 cloneMap[curNb] = newNb;
             }
             newNode->neighbors.push_back(cloneMap[curNb]);
         }
     }
     return cloneMap[node];
}</undirectedgraphnode></undirectedgraphnode></undirectedgraphnode>
### 关于DFSBFS算法的练习题及相关解析 #### 一、DFS(深度优先搜索) DFS的核心思想是从某个起点开始,尽可能深地探索每一个分支,直到无法再深入为止。以下是几个经典的DFS题目及其解析: 1. **岛屿数量** - **描述**: 给定一个由 &#39;1&#39; (陆地) 和 &#39;0&#39; (水) 组成的二维网格,计算岛屿的数量。岛屿总是被水包围,并且是由相邻陆地连接而成的区域。 - **示例代码**: ```python def numIslands(grid): if not grid or not grid[0]: return 0 m, n = len(grid), len(grid[0]) visited = [[False]*n for _ in range(m)] def dfs(x, y): if x &lt; 0 or x &gt;= m or y &lt; 0 or y &gt;= n or grid[x][y] == &quot;0&quot; or visited[x][y]: return visited[x][y] = True directions = [(0,1),(1,0),(-1,0),(0,-1)] # 右 下 上 左 for dx, dy in directions: nx, ny = x + dx, y + dy dfs(nx, ny) count = 0 for i in range(m): for j in range(n): if grid[i][j] == &quot;1&quot; and not visited[i][j]: dfs(i, j) count += 1 return count ``` 这里通过递归的方式实现了DFS逻辑[^2]。 2. **迷宫问题** - **描述**: 在给定的一个矩阵中,从起始点到达终点的所有路径数是多少? - **解析**: 使用DFS尝试每一条可能的路径,当遇到障碍物或超出边界时停止当前路径的扩展[^3]。 --- #### 二、BFS(广度优先搜索) BFS是一种逐层展开的搜索方式,适合解决最短路径类问题。以下是几个典型的BFS题目及其解析: 1. **克隆图** - **描述**: 给定无向连通图中一个节点的引用,返回其深拷贝(即克隆)。每个节点都含有一个 `val` (整数值)和一个列表 `neighbors` 表示它的邻居节点。 - **示例代码**: ```python from collections import deque class Node: def __init__(self, val=0, neighbors=None): self.val = val self.neighbors = neighbors if neighbors is not None else [] def cloneGraph(node): if not node: return None queue = deque([node]) clones = {node: Node(node.val)} while queue: current = queue.popleft() for neighbor in current.neighbors: if neighbor not in clones: clones[neighbor] = Node(neighbor.val) queue.append(neighbor) clones[current].neighbors.append(clones[neighbor]) return clones[node] ``` 2. **腐烂橘子** - **描述**: 在一个二维网格中,有新鲜橘子和腐烂橘子。每一分钟,任何与腐烂橘子相邻的新鲜橘子都会变质。求所有橘子全部腐烂所需的最少时间。 - **解析**: 利用队列记录每次需要处理的状态变化,逐步扩散感染范围直至没有新的可感染对象[^4]。 --- #### 三、综合应用实例 以下是一个结合了DFS/BFS的应用场景&mdash;&mdash;图像染色问题: - **输入**: 图像数组 `image`, 起始坐标 `(sr, sc)` 和新颜色 `newColor`. - **目标**: 将与初始位置相同颜色的所有相连像素替换为指定的新颜色。 - **解决方案**: 如果旧颜色等于新颜色,则无需执行任何操作;否则可以通过DFSBFS完成任务。具体实现见上述&ldquo;岛屿数量&rdquo;的变形版本。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值