您的位置:首页 > 其它

Clone Graph

2016-08-29 07:38 281 查看
Clone an undirected graph. Each node in the graph contains a
label
and a list of its
neighbors
.

How we serialize an undirected graph:

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
/ \
\_/


Have you met this question in a real interview?

Yes

Example

return a deep copied graph.

/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
*     int label;
*     vector<UndirectedGraphNode *> neighbors;
*     UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
/**
* @param node: A undirected graph node
* @return: A undirected graph node
*/
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
// write your code here

// suppose the value of nodes are unique.
// For every node, construct a new node of the same value. For its neighbours, first check if the neighbour has been created (value equals or not), if not, create a node and push into a queue, if so, link the it to the neighbor.
// To check whether the neighbour has been visited, maintain a hash map to map the original node to a newly created node.
if (!node) return node;
queue<UndirectedGraphNode* > qu;
qu.push(node);
unordered_map<UndirectedGraphNode*, UndirectedGraphNode* > um;
UndirectedGraphNode* result = new UndirectedGraphNode(node->label);
um[node] = result;
while (!qu.empty()) {
UndirectedGraphNode* temp = qu.front();
qu.pop();
UndirectedGraphNode* move = um[temp];

for (auto neighbor : temp->neighbors) {
// if the neighbor is not created, created it and map neighbor to a new create node, update the neighbor of move with newly created node
if (um.find(neighbor) == um.end()) {
UndirectedGraphNode* newNeighbor = new UndirectedGraphNode(neighbor->label);
um[neighbor] = newNeighbor;
move->neighbors.push_back(newNeighbor);
qu.push(neighbor);
} else {
move->neighbors.push_back(um[neighbor]);
}
}
}
return result;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: