[LeetCode]Clone Graph

解题思路:
1,要避免环带来的干扰,hash表没商量;
2,但如果用unordered_set, 麻烦,应为对一个 original node,你只能通过label去判断是否已经克隆,这不能用set原有的 find方法。如果你set中存label,必然要有一个对应的存pointer的存储结构。
3,所以,用unordered_map,从 originalGraph 映射到 cloneGraph,节点一一对应,label什么的都不用管了;
4,搜索,深搜或者广搜都可以。 


方法一,BFS:
/**
 * Definition for undirected graph.
 * struct UndirectedGraphNode {
 *     int label;
 *     vector<UndirectedGraphNode *> neighbors;
 *     UndirectedGraphNode(int x) : label(x) {};
 * };
 */
class Solution {
public:
    // BFS
    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
        if (node == NULL) return NULL;

        queue<UndirectedGraphNode *> q;
        q.push(node);
        _map[node] = new UndirectedGraphNode(node->label);

        while(!q.empty()){
            auto nd = q.front();
            q.pop();
            auto it = nd->neighbors.begin();
            while(it != nd->neighbors.end()){
                if (_map.find(*it) == _map.end()){
                    _map[*it] = new UndirectedGraphNode((*it)->label);
                    q.push(*it);
                }
                _map[nd]->neighbors.push_back(_map[*it]);

                it++;
            }
        }

        return _map[node];
    }

private:
    unordered_map<UndirectedGraphNode *, UndirectedGraphNode *> _map;
};

方法二,DFS:
/**
 * Definition for undirected graph.
 * struct UndirectedGraphNode {
 *     int label;
 *     vector<UndirectedGraphNode *> neighbors;
 *     UndirectedGraphNode(int x) : label(x) {};
 * };
 */
class Solution {
public:
    // DFS
    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
        if (node == NULL) return NULL;
        if (_map.find(node) == _map.end()){
            _map[node] = new UndirectedGraphNode(node->label);

            auto it = node->neighbors.begin();
            while(it != node->neighbors.end()){
                _map[node]->neighbors.push_back(cloneGraph(*it));
                it++;
            }
        }

        return _map[node];
    }

private:
    unordered_map<UndirectedGraphNode *, UndirectedGraphNode *> _map;
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值