您的位置:首页 > 其它

Leetcode 133 Clone Graph

2016-06-22 22:28 561 查看
编码编到一半出去吃了顿大餐  回来写了两行  提交后改了两行 通过了  但是现在思路是乱的。

以下思路是做题时想到的。

首先既然要克隆整个图,那么就要遍历图中所有的节点,而且只须遍历一遍。创造一个队列以及集合,用队列广搜所有的点,用集合判断这个节点是否已在队列中保证一个点只遍历一遍。

然后是再造一个相同的图部分,需要一个队列和遍历图的过程同步。过程:原图节点和对应新图节点出队,将节点的相邻节点入队(要判断节点是否已在队中,若已入队,则找到旧节点和新节点的对应关系,赋值即可),同时创造一个对应新图节点并入队。循环直到队列为空。

class Solution {

public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if (node == NULL)
return NULL;
set<int> a;
queue<UndirectedGraphNode *> q;
queue<UndirectedGraphNode *> q1;
map<UndirectedGraphNode *, UndirectedGraphNode *>pair;
UndirectedGraphNode *r = new UndirectedGraphNode(node->label);
q.push(node);
q1.push(r);
a.insert(set<int>::value_type(node->label));
pair.insert(map<UndirectedGraphNode*, UndirectedGraphNode*>::value_type(node, r));
while (!q.empty())
{
UndirectedGraphNode *n;
UndirectedGraphNode *m;
n = q.front();
m = q1.front();
q.pop();
q1.pop();
for (vector<UndirectedGraphNode *>::iterator it = n->neighbors.begin(); it != n->neighbors.end(); it++)
{
if (a.find((*it)->label) == a.end())
{
q.push(*it);
UndirectedGraphNode *p = new UndirectedGraphNode((*it)->label);
m->neighbors.push_back(p);
q1.push(p);
pair.insert(map<UndirectedGraphNode*, UndirectedGraphNode*>::value_type(*it, p));
a.insert(set<int>::value_type((*it)->label));
}
else
{
m->neighbors.push_back(pair[*it]);
}
}
}
return r;
}

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