每日一题: 133.克隆图

133.克隆图

广搜算法

1.使用一个哈希表 visited 存储所有已被访问和克隆的节点。哈希表中的 key 是原始图中的节点,value 是克隆图中的对应节点。

2.将题目给定的节点添加到队列。克隆该节点并存储到哈希表中。

3.每次从队列首部取出一个节点,遍历该节点的所有邻接点。如果某个邻接点已被访问,则该邻接点一定在 visited 中,那么从 visited 获得该邻接点,否则创建一个新的节点存储在 visited 中,并将邻接点添加到队列。将克隆的邻接点添加到克隆图对应节点的邻接表中。重复上述操作直到队列为空,则整个图遍历结束。

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> neighbors;
    
    Node() {
        val = 0;
        neighbors = vector<Node*>();
    }
    
    Node(int _val) {
        val = _val;
        neighbors = vector<Node*>();
    }
    
    Node(int _val, vector<Node*> _neighbors) {
        val = _val;
        neighbors = _neighbors;
    }
};
*/

class Solution {
public:
    Node* cloneGraph(Node* node) {
        if (node==NULL) return NULL;

        unordered_map<Node*, Node*> vis;
        queue<Node*> q;
        q.push(node);
        Node* clonenode = new Node(node->val);
        vis[node] = clonenode;

        while (!q.empty())
        {
            Node* tmp = q.front();
            q.pop();
            Node* clonetmp = vis[tmp];
            for (auto & neighbor:tmp->neighbors)
            {
                if (vis.find(neighbor)==vis.end())
                {
                    vis[neighbor] = new Node(neighbor->val);
                    q.push(neighbor);
                }
                clone.tmp->neighbors.push_back(vis[neighbor])
            }
            
        }
        return clonenode;

    }
};

猜你喜欢

转载自blog.csdn.net/hbhhhxs/article/details/107958940