1+ // Copyright (C) 2013 Leslie Zhai <[email protected] >2+
13#include < iostream>
24#include < vector>
35#include < unordered_map>
46#include < queue>
57
6- class Node ;
8+ template < typename T> class graph_node ;
79
10+ typedef graph_node<int > Node;
811typedef std::unordered_map<Node*, Node*> Map;
12+ typedef std::unordered_map<Node*, Node*>::iterator MapIter;
913
10- class Node
14+ template < typename T> class graph_node
1115{
1216public:
13- Node () {}
14- ~Node () {}
17+ graph_node () {}
18+ graph_node (T data) :m_data(data) {}
19+ ~graph_node () {}
1520
1621public:
17- std::vector<Node*> neighbors;
22+ std::vector<graph_node<T>*> neighbors;
23+ T get_data () { return m_data; }
24+
25+ private:
26+ T m_data;
1827};
1928
20- static Node* graphCopy;
29+ static Node* graphCopy = NULL ;
2130static Map map;
2231
23- static void m_cleanup (Node* clone )
32+ static void m_cleanup ()
2433{
34+ MapIter iter;
35+ int i;
36+
37+ for (iter = map.begin (); iter != map.end (); iter++)
38+ {
39+ for (i = 0 ; i < (*iter).second ->neighbors .size (); i++)
40+ {
41+ delete (*iter).second ->neighbors [i];
42+ (*iter).second ->neighbors [i] = NULL ;
43+ }
44+ }
2545
46+ if (graphCopy)
47+ {
48+ delete graphCopy;
49+ graphCopy = NULL ;
50+ }
2651}
2752
2853Node* clone (Node* graph)
2954{
3055 if (!graph)
3156 return NULL ;
57+ else
58+ std::cout << " DEBUG: origin graph node " << graph->get_data () << std::endl;
3259
3360 std::queue<Node*> q;
3461 q.push (graph);
@@ -44,17 +71,20 @@ Node* clone(Node* graph)
4471 for (int i = 0 ; i < n; i++)
4572 {
4673 Node* neighbor = node->neighbors [i];
74+ std::cout << " DEBUG: neighbor " << neighbor->get_data () << std::endl;
4775 // 没有该副本
4876 if (map.find (neighbor) == map.end ())
4977 {
5078 Node* p = new Node ();
79+ std::cout << " DEBUG: new clone" << std::endl;
5180 map[node]->neighbors .push_back (p);
5281 map[neighbor] = p;
5382 q.push (neighbor);
5483 }
5584 else
5685 {
5786 // 副本已经存在
87+ std::cout << " DEBUG: cloned exist " << map[neighbor]->get_data () << std::endl;
5888 map[node]->neighbors .push_back (map[neighbor]);
5989 }
6090 }
@@ -65,5 +95,16 @@ Node* clone(Node* graph)
6595
6696int main (int argc, char * argv[])
6797{
98+ Node* n1 = new Node (1 );
99+ Node* n2 = new Node (2 );
100+ Node* n3 = new Node (3 );
101+
102+ n1->neighbors .push_back (n2);
103+ n1->neighbors .push_back (n3);
104+
105+ clone (n1);
106+
107+ m_cleanup ();
108+
68109 return 0 ;
69110}
0 commit comments