[LeetCode] Clone Graph

来源:互联网 发布:js obj 获取value 编辑:程序博客网 时间:2024/04/30 10:00

问题:

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

  1. First node is labeled as 0. Connect node 0 to both nodes 1 and 2.
  2. Second node is labeled as 1. Connect node 1 to node 2.
  3. 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         / \         \_/


分析:

思路本身没有什么tricky的地方。用bfs或者dfs来对原图进行traversal,同时复制原图即可。实践发现,dfs比bfs更简便。这里给出两个版本的代码。


代码:

bfs:

class Solution {public:UndirectedGraphNode *bfs(UndirectedGraphNode *node, map<int, UndirectedGraphNode *> &visited) {queue<UndirectedGraphNode *> bfsQueue;bfsQueue.push(node);while (!bfsQueue.empty()) {UndirectedGraphNode * curr = bfsQueue.front();UndirectedGraphNode * copyCurr = visited.find(curr->label)== visited.end() ? new UndirectedGraphNode(curr->label) :visited[curr->label];visited[curr->label] = copyCurr;bfsQueue.pop();for (int i = 0; i < curr->neighbors.size(); i ++) {if (visited.find(curr->neighbors[i]->label) == visited.end()) { // first time visitbfsQueue.push(curr->neighbors[i]);UndirectedGraphNode *temp = new UndirectedGraphNode(curr->neighbors[i]->label);visited[curr->neighbors[i]->label] = temp;copyCurr->neighbors.push_back(temp);}else { // not first time visitUndirectedGraphNode * temp = visited[curr->neighbors[i]->label];copyCurr->neighbors.push_back(temp);}}}return visited[node->label];}UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {if (!node) return node;map<int, UndirectedGraphNode *> visited;return bfs(node, visited);}};

dfs:

class Solution {public:UndirectedGraphNode *dfs(UndirectedGraphNode *node, map<int, UndirectedGraphNode *> &visited) {UndirectedGraphNode * copyNode = new UndirectedGraphNode (node->label);visited[node->label] = copyNode;for (int i = 0; i < node->neighbors.size(); i ++) {if (!visited[node->neighbors[i]->label])copyNode->neighbors.push_back(dfs(node->neighbors[i], visited));elsecopyNode->neighbors.push_back(visited[node->neighbors[i]->label]);}return copyNode;}UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {if (!node) return node;map<int, UndirectedGraphNode *> visited;return dfs(node, visited);}};



0 0
原创粉丝点击