您的位置:首页 > 其它

leetcode第一刷_Clone Graph

2014-05-05 09:57 351 查看
这道题相当的恶心,写了好多遍,最后的结果也不满意。主要是对图的数据结构不太熟悉,还有大量的复制操作和指针。

我的解法是,用一个队列保存原图中的节点,每个节点只入队出队一次,否则会超时,而复制前后label值是一致的且所有的label不同,因此可以用map来存放。每次遇到一个新节点的时候,就分配空间,但是每次循环只复制一个节点。如果这个节点在之前节点的neighbor中出现过,那么它的空间已经分配了,只不过neighbor还没更新,就直接从map中取出它的指针即可。根据队列中的原图节点,复制这个节点的neighbor,要一个一个的加入结构体中因为可能还有未访问过的label,要为他分配空间。

实现的时候,我用了一些中间的变量,以求写的时候方便一些。vector是重载过复制操作符的,如果他里面放的确实是指针,可以直接“=”复制的,assigne方法起到的作用一样。我一开始把map什么的都放在方法的外面,总是报错,移到里面就ac了。

class Solution {
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if(node == NULL)
return NULL;
map<int, UndirectedGraphNode *> visited;
queue<UndirectedGraphNode *> que;
vector<UndirectedGraphNode *> pvec;
vector<UndirectedGraphNode *> newNeighbors;
UndirectedGraphNode *pNode, *newNode, *pNeighbor;
que.push(node);
while(!que.empty()){
pNode = que.front();
que.pop();
if(visited.find(pNode->label) == visited.end()){
newNode = new UndirectedGraphNode(pNode->label);
visited[pNode->label] = newNode;
}else{
newNode = visited[pNode->label];
}
pvec.assign(pNode->neighbors.begin(), pNode->neighbors.end());
for(int i=0;i<pvec.size();i++){
if(visited.find(pvec[i]->label) == visited.end()){
pNeighbor = new UndirectedGraphNode(pvec[i]->label);
newNeighbors.push_back(pNeighbor);
visited[pNeighbor->label] = pNeighbor;
que.push(pvec[i]);
}else{
newNeighbors.push_back(visited[pvec[i]->label]);
}
}
newNode->neighbors.assign(newNeighbors.begin(), newNeighbors.end());
newNeighbors.clear();
pvec.clear();
}
return visited[node->label];
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: