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;
}
};
以下思路是做题时想到的。
首先既然要克隆整个图,那么就要遍历图中所有的节点,而且只须遍历一遍。创造一个队列以及集合,用队列广搜所有的点,用集合判断这个节点是否已在队列中保证一个点只遍历一遍。
然后是再造一个相同的图部分,需要一个队列和遍历图的过程同步。过程:原图节点和对应新图节点出队,将节点的相邻节点入队(要判断节点是否已在队中,若已入队,则找到旧节点和新节点的对应关系,赋值即可),同时创造一个对应新图节点并入队。循环直到队列为空。
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;
}
};
相关文章推荐
- print 不换行
- git 解决冲突
- mysql高级:event触发器
- 成员的类模板
- java位运算
- 置换矩阵(permutation matrix)
- ARM处理器的三级流水线和ARM指令及寻址方式
- C++实现邮件群发的方法
- PHP5各个版本的新功能和新特性总结
- ubuntu入门
- IoC容器中装配Bean
- Ubuntu配置和修改IP地址
- Android FragmentStatePagerAdapter的写法
- Android PDF截取封面:PDF缩略图预览效果
- Spring中Bean的生命周期
- 第一章 分布式系统介绍
- Arduino 通过串口传值给Processing 显示
- 个人最终总结
- USB的VID和PID,以及分类(Class,SubClass,Protocol)
- 数据挖掘工程师的面试问题与答题思路