133. Clone Graph

来源:互联网 发布:windows最新软件版本 编辑:程序博客网 时间:2024/06/05 00:46

#
@(leetcode)[BFS, 图论]

Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.

OJ’s undirected graph serialization:
Nodes are labeled uniquely.

We use # as a separator for each node, and , as a separator for node label and each neighbor of the node.
As an example, consider the serialized graph {0,1,2#1,2#2,2}.

The graph has a total of three nodes, and therefore contains three parts as separated by #.

First node is labeled as 0. Connect node 0 to both nodes 1 and 2.
Second node is labeled as 1. Connect node 1 to node 2.
Third node is labeled as 2. Connect node 2 to node 2 (itself), thus forming a self-cycle.
Visually, the graph looks like the following:

        1       / \      /   \     0 --- 2          / \          \_/

代码

/** * Definition for undirected graph. * struct UndirectedGraphNode { *     int label; *     vector<UndirectedGraphNode *> neighbors; *     UndirectedGraphNode(int x) : label(x) {}; * }; */class Solution {public:    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {        if(NULL == node) {            return node;        }        queue<UndirectedGraphNode*> que;        unordered_map<int, UndirectedGraphNode*> hash_map;        que.push(node);        //第一次BFS,将所有节点存入到map中        while(!que.empty()) {            UndirectedGraphNode* tmp = que.front();            que.pop();            if(hash_map.count(tmp->label) == 0) {                UndirectedGraphNode* new_node = new UndirectedGraphNode(tmp->label);                hash_map[new_node->label] = new_node;                for(int i = 0; i < tmp->neighbors.size(); ++i) {                    que.push(tmp->neighbors[i]);                }            }        }        //第二次BFS,复制原图的所有临接节点        que.push(node);        while(!que.empty()) {            UndirectedGraphNode* tmp = que.front();            que.pop();            UndirectedGraphNode* exisit_node = hash_map[tmp->label];            if(exisit_node->neighbors.empty() && !tmp->neighbors.empty()) {                for(int i = 0; i < tmp->neighbors.size(); ++i) {                    exisit_node->neighbors.push_back(hash_map[tmp->neighbors[i]->label]);                    que.push(tmp->neighbors[i]);                }            }        }        return hash_map[node->label];    }};
0 0