您的位置:首页 > 其它

[LeetCode] Clone Graph

2014-07-18 14:46 260 查看
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
#
.

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

思路:用map存储创建的新的结点,其中key是结点的label值,value是结点的指针值。


/**
* 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;
UndirectedGraphNode *pnode = node;
UndirectedGraphNode *head = new UndirectedGraphNode(node->label);
UndirectedGraphNode *p = head;
map<int,UndirectedGraphNode *> labelAndNode;
labelAndNode[head->label] = head;
pNodeNeighbors(pnode,p,labelAndNode);
return head;
}
private:
void pNodeNeighbors(UndirectedGraphNode *&pnode,UndirectedGraphNode *&p,map<int,UndirectedGraphNode *> &labelAndNode)
{
int num = pnode->neighbors.size();
UndirectedGraphNode *pnew ;
for(int i = 0;i<num;i++)
{
if(labelAndNode.count(pnode->neighbors[i]->label)==0)
{
pnew = new UndirectedGraphNode(pnode->neighbors[i]->label);
labelAndNode[pnode->neighbors[i]->label] = pnew;
p->neighbors.push_back(pnew);
pNodeNeighbors(pnode->neighbors[i],p->neighbors[i],labelAndNode);
}
else
{
pnew =  labelAndNode[pnode->neighbors[i]->label];
p->neighbors.push_back(pnew);
}

}

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: