lintcode137克隆图(笔记) - BFS

习题链接

图克隆的含义

图克隆是指在开辟另一块内存,去存储一个与原图结构完全一样的图。

思路

  1. 图由点和边构成
  2. 先找到所有点,在新内存中存储下来
  3. 在找的过程中还要存储边
  4. 把所有的边复制,之后return
  5. 回到开头, 最开始只知道一个点和该点的相邻关系,还知道图是联通的
  6. 上述问题是给一个点,找到和他联通的其他所有点,这类问题被称为连通块问题。连通块问题可以用BFS也可以用DFS,最好用BFS(能用BFS就不要用DFS)
  7. BFS做连通块问题不需要分层遍历,只需要一层循环就可以,不需要中间的For循环

程序的结构(重要)

分为三部分:

  1. 用BFS找到所有点
  2. 利用dict,在新旧节点之间建立一个关系
  3. 复制所有的边
    写程序不要相互嵌套要解耦合,以上三步要并行!!!

克隆图可能遇到的情况

  1. BFS里再出列的时候添加visited会导致数据重复进入代码如下
def getNodes(self, node):
	queque = deque([node])
	#visited = set([node])

	while queque:
		head = queque.popleft()
		visited.add(head)#错误代码处
		for neighbor in head.neighbors:
			if neighbor not in visited:
				#visited.add(neighbor)
				queque.append(neightbor)
	return visited
		

再上述位置将head加入visited的问题是会导致有些节点重复进入队列中。
队列中出现重复
图中E出现两次,而且随后的层会出现雪崩效应,不断地翻倍重复,虽然BFS最后会出结果,结果也是对的,但是时间复杂度会多出很多。
解决办法:visited和queque同时添加

完整答案:

"""
class UndirectedGraphNode:
     def __init__(self, x):
         self.label = x
         self.neighbors = []
"""
from collections import deque
class Solution:
    """
    @param node: A undirected graph node
    @return: A undirected graph node
    """
    def cloneGraph(self, node):
        # write your code here
        root = node
        if node is None:
            return node
        #在旧图中找到所有点
        nodes = self.find_all_nodes(node)
        
        # 创建一个字典,把取出来的点与旧图中点创建一个映射关系
        mapping = {}
        for node in nodes:
            mapping[node] = UndirectedGraphNode(node.label)
    
        #将边复制过去
        for node in nodes:
            new_node = mapping[node]
            for neighbor in node.neighbors:
                new_neighbors = mapping[neighbor]
                new_node.neighbors.append(new_neighbors)
        return mapping[root]
        
    def find_all_nodes(self, node):
        queque = deque([node])
        visited = set([node])
        while queque:
            head = queque.popleft()
            for neighbor in head.neighbors:
                if neighbor not in visited:
                    visited.add(neighbor)
                    queque.append(neighbor)
        return visited

概念理清

  1. 无向图:互为邻居
  2. 图的构成: 顶点和边 G = <V, E>
    vertex, edge
  3. 解耦合:能分开干的事情就分开干
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值