原理比较简单,想复制一张图,可以创建出所有的node,再把所有的neighbor都对应好就出来了。
其实还是图的遍历,我这里用的stack,用队列肯定也行,就是深度和广度的区别而已。
下面的set和stack我一共用的指针一个用的值,但是感觉都可以。
#include<stdc++.h>
using namespace std;
class Node {
public:
int val;
vector<Node*> neighbors;
Node() {
val = 0;
neighbors = vector<Node*>();
}
Node(int _val) {
val = _val;
neighbors = vector<Node*>();
}
Node(int _val, vector<Node*> _neighbors) {
val = _val;
neighbors = _neighbors;
}
};
Node* cloneGraph(Node* node_first)
{
unordered_map<int, Node*> node_map;
if(nullptr==node_first)
return node_first;
unordered_set<int>used_node;
stack<Node*>to_use_node;//<只能存指针
to_use_node.push(node_first);
node_map.insert(pair<int, Node*>(node_first->val, new Node(node_first->val)));
used_node.insert(node_first->val);
while(!to_use_node.empty())
{
auto node = to_use_node.top();
to_use_node.pop();
for(auto p_neighbor_node : node->neighbors)
{
if(node_map.find(p_neighbor_node->val)==node_map.end())
node_map.insert(pair<int,Node*>(p_neighbor_node->val, new Node(p_neighbor_node->val)));
auto new_neighbor_node = node_map.find(p_neighbor_node->val)->second;
node_map.find(node->val)->second->neighbors.push_back(new_neighbor_node);
if(used_node.find(p_neighbor_node->val)==used_node.end())
{
to_use_node.push(p_neighbor_node);
used_node.insert(p_neighbor_node->val);
}
}
}
return node_map.find(node_first->val)->second;
}
int main()
{
Node* node1 = new Node(1);
Node* node2 = new Node(2);
node1->neighbors.push_back(node2);
node2->neighbors.push_back(node1);
cloneGraph(node1);
return 0;
}