【宽度优先搜索BFS】 Lintcode 137. 克隆图

Lintcode 137. 克隆图

题目描述:克隆一张无向图. 无向图的每个节点包含一个 label 和一个列表 neighbors. 保证每个节点的 label 互不相同.
你的程序需要返回一个经过深度拷贝的新图. 新图和原图具有同样的结构, 并且对新图的任何改动不会对原图造成任何影响.
在这里插入图片描述
小知识深度拷贝的意思:复制数组的内容,而不是复制其引用,复制引用一般称为软拷贝。

解题思路:

  1. 从一个节点出发找到所有节点。
  2. 拷贝节点
  3. 拷贝边(连接关系)
/**
 * Definition for undirected graph.
 * struct UndirectedGraphNode {
 *     int label;
 *     vector<UndirectedGraphNode *> neighbors;
 *     UndirectedGraphNode(int x) : label(x) {};
 * };
 */

class Solution {
public:
    /**
     * @param node: A undirected graph node
     * @return: A undirected graph node
     */
    UndirectedGraphNode* cloneGraph(UndirectedGraphNode* node) {
        if (!node) {
            return nullptr;
        }
        
        UndirectedGraphNode* oldnode = node;
        UndirectedGraphNode* newnode = new UndirectedGraphNode(node->label);
        unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> old2newMap;//旧节点与新节点间建立映射
        queue<UndirectedGraphNode*> graphQueue;
        graphQueue.push(node);
        old2newMap[node] = newnode;
        
        //BFS寻找所有点
        while (!graphQueue.empty()) {
            oldnode = graphQueue.front();
            newnode = old2newMap[oldnode];//复制节点
            graphQueue.pop();
            for (int i = 0; i < oldnode->neighbors.size(); ++i) {
                UndirectedGraphNode* nb = oldnode->neighbors[i];
                if (old2newMap.count(nb)) {
                    newnode->neighbors.push_back(old2newMap[nb]);//复制边(连接关系)
                } else {
                    UndirectedGraphNode* tmp = new UndirectedGraphNode(nb->label);
                    newnode->neighbors.push_back(tmp);//作为newnode邻居
                    old2newMap[nb] = tmp;//与旧节点中的nb建立映射
                    graphQueue.push(nb);
                }
            }
        }
        return old2newMap[node];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值