/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if(node == NULL) return NULL;
map<UndirectedGraphNode *, UndirectedGraphNode *> hasCopied;
queue<UndirectedGraphNode *> uncompleteCopied;
hasCopied[node] = new UndirectedGraphNode(node->label);
//hasCopied[NULL] = NULL;
uncompleteCopied.push(node);
while(!uncompleteCopied.empty())
{
UndirectedGraphNode* pCurNode = uncompleteCopied.front();
uncompleteCopied.pop();
for(int i = 0; i < pCurNode->neighbors.size(); ++i)
{
UndirectedGraphNode* pNeighborNode = pCurNode->neighbors[i];
if(hasCopied.find(pNeighborNode) != hasCopied.end())
hasCopied[pCurNode]->neighbors.push_back(hasCopied[pNeighborNode]);
else
{
hasCopied[pNeighborNode] = new UndirectedGraphNode(pNeighborNode->label);
hasCopied[pCurNode]->neighbors.push_back(hasCopied[pNeighborNode]);
uncompleteCopied.push(pNeighborNode);
}
}
}
return hasCopied[node];
}
};