您的位置:首页 > 其它

Clone Graph

2014-08-12 22:12 162 查看
Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.

思路:使用BFS遍历无向图。使用map记录原始节点和新节点的地址映射,使用set记录已经完成复制操作的节点地址。

查找map,确定是否需要对当前节点进行new操作,若是,对其进行new操作,并将地址映射存入map。

查找set,确定是否已经完成了对当前节点的复制操作,若否,则表明需要更新其对应新节点的邻居信息。遍历当前节点的邻居向量,若某一邻居尚未被new出,则对其进行new操作,并将地址映射存入map,同时将新地址存入当前节点对应新节点的邻居向量中。

class Solution {
public:
UndirectedGraphNode *cloneGraph( UndirectedGraphNode *node ) {
if( !node ) { return 0; }
list<UndirectedGraphNode*> nodeList;
unordered_map<UndirectedGraphNode*,UndirectedGraphNode*> addrMap;
unordered_set<UndirectedGraphNode*> accessedSet;
nodeList.push_back( node );
while( !nodeList.empty() ) {
UndirectedGraphNode *newNode = 0, *curr = nodeList.front();
nodeList.pop_front();
if( addrMap.find( curr ) != addrMap.end() ) {
newNode = addrMap[curr];
} else {
newNode = new UndirectedGraphNode( curr->label );
addrMap[curr] = newNode;
}
if( accessedSet.count( curr ) ) { continue; }
for( size_t i = 0; i != curr->neighbors.size(); ++i ) {
UndirectedGraphNode *newNeighbor = 0, *neighbor = curr->neighbors[i];
if( addrMap.find( neighbor ) != addrMap.end() ) {
newNeighbor = addrMap[neighbor];
} else {
newNeighbor = new UndirectedGraphNode( neighbor->label );
addrMap[neighbor] = newNeighbor;
}
newNode->neighbors.push_back( newNeighbor );
nodeList.push_back( neighbor );
}
accessedSet.insert( curr );
}
return addrMap[node];
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: