1、图的克隆,利用散列
/**
* 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;
queue <UndirectedGraphNode*> graphNode;
unordered_map<UndirectedGraphNode*,UndirectedGraphNode*> hist;//
graphNode.push(node);
UndirectedGraphNode *root, *cur;
root = new UndirectedGraphNode(node->label);
hist[node]=root;
while (!graphNode.empty()){
cur = graphNode.front();
graphNode.pop();
for (int i=0;i<cur->neighbors.size();i++){ //对当前节点的每个邻接点进行遍历
if (hist.find(cur->neighbors[i])==hist.end()){
graphNode.push(cur->neighbors[i]);
UndirectedGraphNode* temp = new UndirectedGraphNode(cur->neighbors[i]->label);
hist[cur->neighbors[i]] = temp;
}
}
vector<UndirectedGraphNode*> neig;
for (int i=0;i<cur->neighbors.size();i++){
neig.push_back(hist[cur->neighbors[i]]);
}
hist[cur]->neighbors = neig;
}
return root;
}
};
/*
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
UndirectedGraphNode *res(NULL);
if (!node) return res;
unordered_map<int, UndirectedGraphNode *> hash;
res=new UndirectedGraphNode(node->label);
hash[node->label]=res;
DFS(node,res,hash);
return res;
}
void DFS(UndirectedGraphNode *src, UndirectedGraphNode *target, unordered_map<int, UndirectedGraphNode *> &hash) {
for (int in(0);in<src->neighbors.size();in++) {
if (hash.find(src->neighbors[in]->label)==hash.end()) { //This is a new node
target->neighbors.push_back(new UndirectedGraphNode(src->neighbors[in]->label));
hash[src->neighbors[in]->label]=target->neighbors.back();
DFS(src->neighbors[in], target->neighbors.back(),hash);
} else { //Otherwise just put the existed node into your neighbors list
target->neighbors.push_back(hash[src->neighbors[in]->label]);
}
}
}