133. Clone Graph

来源:互联网 发布:mac奶瓶粉底液 编辑:程序博客网 时间:2024/06/09 18:28

题目:

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


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#.

  1. First node is labeled as 0. Connect node0 to both nodes 1 and2.
  2. Second node is labeled as 1. Connect node1 to node 2.
  3. Third node is labeled as 2. Connect node2 to node 2 (itself), thus forming a self-cycle.

Visually, the graph looks like the following:

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

题解:

这道题解法并不唯一,有BFS,DFS等解法。以下主要讲的是BFS 的解法。为了clone无向图,我们必须每个点都要复制,每个点只能遍历一次,需要判断点是否被重复访问。队列q用于记录BFS遍历的层次信息。

/** * Definition for undirected graph. * struct UndirectedGraphNode { *     int label; *     vector<UndirectedGraphNode *> neighbors; *     UndirectedGraphNode(int x) : label(x) {}; * }; */class Solution {public:    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {        if(node == NULL)        return NULL;        queue<UndirectedGraphNode*> q;         map<UndirectedGraphNode*, UndirectedGraphNode*> m;        UndirectedGraphNode *nodeCopy = new UndirectedGraphNode(node->label);        q.push(node);        m[node] = nodeCopy;    while(!q.empty()) {     UndirectedGraphNode* d = q.front();    q.pop();    for(auto neighbor: d->neighbors) {    if(m.find(neighbor)==m.end()) {    auto copy = new UndirectedGraphNode(neighbor->label);     m[neighbor] = copy;    q.push(neighbor);    }                m[d]->neighbors.push_back(m[neighbor]);    }    }    return nodeCopy;    }};
end!

0 0
原创粉丝点击