Clone Graph
2016-08-29 07:38
281 查看
Clone an undirected graph. Each node in the graph contains a
How we serialize an undirected graph:
Nodes are labeled uniquely.
We use
As an example, consider the serialized graph
The graph has a total of three nodes, and therefore contains three parts as separated by
First node is labeled as
Second node is labeled as
Third node is labeled as
Visually, the graph looks like the following:
Have you met this question in a real interview?
Yes
Example
return a deep copied graph.
labeland 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
0to both nodes
1and
2.
Second node is labeled as
1. Connect node
1to node
2.
Third node is labeled as
2. Connect node
2to 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; } };
相关文章推荐
- [LeetCode] Clone Graph, Solution
- LeetCode || Clone Graph
- Clone Graph
- Graph Clone(DFS)
- leetcode Clone Graph
- [LeetCode] Clone Graph
- Leetcode NO.133 Clone Graph
- [LeetCode] Clone Graph
- 【leetcode】clone-graph
- clone Graph的总结之二
- [LeetCode]Clone Graph
- leetcode -- Clone Graph
- Leetcode: Clone Graph
- clone-graph Java code
- Clone Graph Part I
- Clone Graph
- LeetCode Clone Graph
- leetcode Clone Graph
- LeetCode 19 Clone Graph
- leetcode Clone Graph