12 class NodeData |
13 class NodeData |
13 { |
14 { |
14 public: |
15 public: |
15 int id; |
16 int id; |
16 bool isVis; |
17 bool isVis; |
|
18 bfs_node_data<TestGraph> bfs; |
17 }; |
19 }; |
18 |
20 |
19 class EdgeData |
21 class EdgeData |
20 { |
22 { |
21 public: |
23 public: |
22 int id; |
24 int id; |
23 }; |
25 }; |
24 |
26 |
25 |
|
26 typedef Graph<NodeData,EdgeData> TestGraph; |
27 typedef Graph<NodeData,EdgeData> TestGraph; |
|
28 |
|
29 /* |
|
30 struct isVis_map {}; |
|
31 bool Get(isVis_map p,TestGraph::NodeIterator i) { return i->isVis;} |
|
32 void Set(isVis_map p,TestGraph::NodeIterator i,bool b) { i->isVis=b;} |
|
33 */ |
|
34 |
|
35 class my_bfs_maps |
|
36 { |
|
37 public: |
|
38 //isVis_map visited; //node->bool (RW) |
|
39 class_element_map<TestGraph::NodeIterator, |
|
40 TestGraph::NodeType, |
|
41 bool, |
|
42 &NodeData::isVis> visited; |
|
43 struct _tree_map_t { |
|
44 typedef TestGraph::EdgeIterator value_type; |
|
45 void Set(const TestGraph::NodeIterator &n,const value_type &t) |
|
46 { |
|
47 cout << t.From()->id << "->" << t.To()->id << '\n'; |
|
48 } |
|
49 } tree; |
|
50 do_nothing_map dist; //node->int (W) |
|
51 do_nothing_map priority; //node->int (W) |
|
52 //priority_map priority; //node->int (W) |
|
53 }; |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 class IGraph |
|
59 { |
|
60 public: |
|
61 |
|
62 // struct NodeType {bfs_node_data<TestGraph> bfs;}; |
|
63 struct NodeType {bool isVis;}; |
|
64 |
|
65 vector<NodeType> nodes; |
|
66 |
|
67 class NodeIterator |
|
68 { |
|
69 public: |
|
70 IGraph *G; |
|
71 int n; |
|
72 NodeIterator &operator ++() { n++; return *this;} |
|
73 NodeType &operator *() const { return G->nodes[n];} |
|
74 NodeType *operator ->() const { return &(G->nodes[n]);} |
|
75 bool isValid() const {return n<=5000;} |
|
76 int Index() {return n;} //csak a kiirashoz kell |
|
77 }; |
|
78 |
|
79 void GetFirst(NodeIterator &i) {i.G=this;i.n=1;} |
|
80 |
|
81 class OutEdgeIterator |
|
82 { |
|
83 public: |
|
84 IGraph *G; |
|
85 int f,t; |
|
86 int gcd() { int a=f;int b=t;int c;while(c=a%b) {a=b;b=c;} ; return b;} |
|
87 OutEdgeIterator &operator ++() {while(++t<=5000&&gcd()==1);return *this;} |
|
88 bool isValid() const {return t<=5000;} |
|
89 NodeIterator From() const {NodeIterator i; i.G=G;i.n=f;return i;} |
|
90 NodeIterator To() const {NodeIterator i; i.G=G;i.n=t;return i;} |
|
91 NodeIterator Anode() const {return From();} |
|
92 NodeIterator Bnode() const {return To();} |
|
93 }; |
|
94 |
|
95 typedef OutEdgeIterator EdgeIterator; |
|
96 void GetFirst(OutEdgeIterator &i,const NodeIterator &n) |
|
97 {i.G=this;i.f=n.n;i.t=0;++i;} |
|
98 |
|
99 IGraph() : nodes(5000) {} |
|
100 }; |
|
101 |
|
102 class IMaps_t |
|
103 { |
|
104 public: |
|
105 // class_element_map<IGraph::NodeIterator, |
|
106 // IGraph::NodeType, |
|
107 // bool, |
|
108 // &IGraph::NodeType::isVis> visited; |
|
109 struct _visited_map_t { |
|
110 typedef bool value_type; |
|
111 void Set(const IGraph::NodeIterator &n,const value_type &t) { n->isVis=t; } |
|
112 value_type Get(const IGraph::NodeIterator &n) const { return n->isVis; } |
|
113 } visited; |
|
114 struct _tree_map_t { |
|
115 typedef IGraph::EdgeIterator value_type; |
|
116 void Set(const IGraph::NodeIterator &n,const value_type &t) |
|
117 { cout << t.From().Index() << "->" << t.To().Index() << '\n'; } |
|
118 } tree; |
|
119 do_nothing_map dist; //node->int (W) |
|
120 do_nothing_map priority; //node->int (W) |
|
121 }; |
27 |
122 |
28 void main() |
123 void main() |
29 { |
124 { |
30 TestGraph G; |
125 TestGraph G; |
31 TestGraph::NodeIterator n,m,o,p,q; |
126 TestGraph::NodeIterator n,m,o,p,q; |