16 Graph& graph; |
18 Graph& graph; |
17 NodeNameMap& node_name_map; |
19 NodeNameMap& node_name_map; |
18 public: |
20 public: |
19 EdgeNameMap(Graph& _graph, NodeNameMap& _node_name_map) : |
21 EdgeNameMap(Graph& _graph, NodeNameMap& _node_name_map) : |
20 graph(_graph), node_name_map(_node_name_map) { } |
22 graph(_graph), node_name_map(_node_name_map) { } |
21 string get(typename Graph::EdgeIt e) const { |
23 string get(typename Graph::Edge e) const { |
22 return |
24 return |
23 (node_name_map.get(graph.tail(e))+"->"+node_name_map.get(graph.head(e))); |
25 (node_name_map.get(graph.tail(e))+"->"+node_name_map.get(graph.head(e))); |
24 } |
26 } |
25 }; |
27 }; |
26 |
28 |
27 int main (int, char*[]) |
29 int main (int, char*[]) |
28 { |
30 { |
29 typedef ListGraph::NodeIt NodeIt; |
31 //typedef SmartGraph Graph; |
30 typedef ListGraph::EdgeIt EdgeIt; |
32 typedef ListGraph Graph; |
31 //typedef ListGraph::EachNodeIt EachNodeIt; |
33 |
32 //typedef ListGraph::EachEdgeIt EachEdgeIt; |
34 typedef Graph::Node Node; |
33 //typedef ListGraph::OutEdgeIt OutEdgeIt; |
35 typedef Graph::Edge Edge; |
34 //typedef ListGraph::InEdgeIt InEdgeIt; |
36 //typedef Graph::NodeIt NodeIt; |
35 //typedef ListGraph::SymEdgeIt SymEdgeIt; |
37 //typedef Graph::EdgeIt EdgeIt; |
|
38 //typedef Graph::OutEdgeIt OutEdgeIt; |
|
39 //typedef Graph::InEdgeIt InEdgeIt; |
|
40 //typedef Graph::SymEdgeIt SymEdgeIt; |
36 |
41 |
37 ListGraph G; |
42 Graph G; |
38 |
43 |
39 NodeIt s=G.addNode(); |
44 Node s=G.addNode(); |
40 NodeIt v1=G.addNode(); |
45 Node v1=G.addNode(); |
41 NodeIt v2=G.addNode(); |
46 Node v2=G.addNode(); |
42 NodeIt v3=G.addNode(); |
47 Node v3=G.addNode(); |
43 NodeIt v4=G.addNode(); |
48 Node v4=G.addNode(); |
44 NodeIt t=G.addNode(); |
49 Node t=G.addNode(); |
45 |
50 |
46 ListGraph::NodeMap<string> node_name(G); |
51 Graph::NodeMap<string> node_name(G); |
47 node_name.set(s, "s"); |
52 node_name.set(s, "s"); |
48 node_name.set(v1, "v1"); |
53 node_name.set(v1, "v1"); |
49 node_name.set(v2, "v2"); |
54 node_name.set(v2, "v2"); |
50 node_name.set(v3, "v3"); |
55 node_name.set(v3, "v3"); |
51 node_name.set(v4, "v4"); |
56 node_name.set(v4, "v4"); |
70 cout << " \\ | | / | | /-> "<< endl; |
75 cout << " \\ | | / | | /-> "<< endl; |
71 cout << " \\ | --/ / | | / "<< endl; |
76 cout << " \\ | --/ / | | / "<< endl; |
72 cout << " \\ \\-> v2 <--/ \\-- v4 -/ "<< endl; |
77 cout << " \\ \\-> v2 <--/ \\-- v4 -/ "<< endl; |
73 cout << " \\--> -------------> "<< endl; |
78 cout << " \\--> -------------> "<< endl; |
74 |
79 |
75 /* |
80 // typedef TrivGraphWrapper<const Graph> CGW; |
76 { |
|
77 cout << "iterator bfs demo 4 ..." << endl; |
|
78 BfsIterator4< ListGraph, ListGraph::OutEdgeIt, ListGraph::NodeMap<bool> > bfs(G); |
|
79 bfs.pushAndSetReached(s); |
|
80 while (!bfs.finished()) { |
|
81 if (OutEdgeIt(bfs).valid()) { |
|
82 cout << "OutEdgeIt: " << bfs; |
|
83 cout << " aNode: " << G.aNode(bfs); |
|
84 cout << " bNode: " << G.bNode(bfs) << " "; |
|
85 } else { |
|
86 cout << "OutEdgeIt: " << "invalid"; |
|
87 cout << " aNode: " << bfs.aNode(); |
|
88 cout << " bNode: " << "invalid" << " "; |
|
89 } |
|
90 if (bfs.isBNodeNewlyReached()) { |
|
91 cout << "bNodeIsNewlyReached "; |
|
92 } else { |
|
93 cout << "bNodeIsNotNewlyReached "; |
|
94 } |
|
95 if (bfs.isANodeExamined()) { |
|
96 cout << "aNodeIsExamined "; |
|
97 } else { |
|
98 cout << "aNodeIsNotExamined "; |
|
99 } |
|
100 cout << endl; |
|
101 ++bfs; |
|
102 } |
|
103 } |
|
104 |
|
105 { |
|
106 cout << "iterator dfs demo 4 ..." << endl; |
|
107 DfsIterator4< ListGraph, ListGraph::OutEdgeIt, ListGraph::NodeMap<bool> > dfs(G); |
|
108 dfs.pushAndSetReached(s); |
|
109 while (!dfs.finished()) { |
|
110 ++dfs; |
|
111 if (OutEdgeIt(dfs).valid()) { |
|
112 cout << "OutEdgeIt: " << dfs; |
|
113 cout << " aNode: " << G.aNode(dfs); |
|
114 cout << " bNode: " << G.bNode(dfs) << " "; |
|
115 } else { |
|
116 cout << "OutEdgeIt: " << "invalid"; |
|
117 cout << " aNode: " << dfs.aNode(); |
|
118 cout << " bNode: " << "invalid" << " "; |
|
119 } |
|
120 if (dfs.isBNodeNewlyReached()) { |
|
121 cout << "bNodeIsNewlyReached "; |
|
122 } else { |
|
123 cout << "bNodeIsNotNewlyReached "; |
|
124 } |
|
125 if (dfs.isANodeExamined()) { |
|
126 cout << "aNodeIsExamined "; |
|
127 } else { |
|
128 cout << "aNodeIsNotExamined "; |
|
129 } |
|
130 cout << endl; |
|
131 //++dfs; |
|
132 } |
|
133 } |
|
134 */ |
|
135 |
|
136 // typedef TrivGraphWrapper<const ListGraph> CGW; |
|
137 // CGW wG(G); |
81 // CGW wG(G); |
138 |
82 |
139 // cout << "bfs and dfs demo on the directed graph" << endl; |
83 // cout << "bfs and dfs demo on the directed graph" << endl; |
140 // for(CGW::EachNodeIt n=wG.first<CGW::EachNodeIt>(); n.valid(); ++n) { |
84 // for(CGW::NodeIt n=wG.first<CGW::NodeIt>(); n.valid(); ++n) { |
141 // cout << n << ": "; |
85 // cout << n << ": "; |
142 // cout << "out edges: "; |
86 // cout << "out edges: "; |
143 // for(CGW::OutEdgeIt e=wG.first<CGW::OutEdgeIt>(n); e.valid(); ++e) |
87 // for(CGW::OutEdgeIt e=wG.first<CGW::OutEdgeIt>(n); e.valid(); ++e) |
144 // cout << e << " "; |
88 // cout << e << " "; |
145 // cout << "in edges: "; |
89 // cout << "in edges: "; |
147 // cout << e << " "; |
91 // cout << e << " "; |
148 // cout << endl; |
92 // cout << endl; |
149 // } |
93 // } |
150 |
94 |
151 { |
95 { |
152 typedef TrivGraphWrapper<const ListGraph> GW; |
96 typedef TrivGraphWrapper<const Graph> GW; |
153 GW wG(G); |
97 GW wG(G); |
154 |
98 |
155 EdgeNameMap< GW, ListGraph::NodeMap<string> > edge_name(wG, node_name); |
99 EdgeNameMap< GW, Graph::NodeMap<string> > edge_name(wG, node_name); |
156 |
100 |
157 cout << "bfs and dfs iterator demo on the directed graph" << endl; |
101 cout << "bfs and dfs iterator demo on the directed graph" << endl; |
158 for(GW::EachNodeIt n=wG.first<GW::EachNodeIt>(); wG.valid(n); wG.next(n)) { |
102 for(GW::NodeIt n=wG.first<GW::NodeIt>(); wG.valid(n); wG.next(n)) { |
159 cout << node_name.get(n) << ": "; |
103 cout << node_name.get(n) << ": "; |
160 cout << "out edges: "; |
104 cout << "out edges: "; |
161 for(GW::OutEdgeIt e=wG.first<GW::OutEdgeIt>(n); wG.valid(e); wG.next(e)) |
105 for(GW::OutEdgeIt e=wG.first<GW::OutEdgeIt>(n); wG.valid(e); wG.next(e)) |
162 cout << edge_name.get(e) << " "; |
106 cout << edge_name.get(e) << " "; |
163 cout << "in edges: "; |
107 cout << "in edges: "; |
223 } |
167 } |
224 } |
168 } |
225 |
169 |
226 |
170 |
227 { |
171 { |
228 typedef RevGraphWrapper<const ListGraph> GW; |
172 typedef RevGraphWrapper<const Graph> GW; |
229 GW wG(G); |
173 GW wG(G); |
230 |
174 |
231 EdgeNameMap< GW, ListGraph::NodeMap<string> > edge_name(wG, node_name); |
175 EdgeNameMap< GW, Graph::NodeMap<string> > edge_name(wG, node_name); |
232 |
176 |
233 cout << "bfs and dfs iterator demo on the reversed directed graph" << endl; |
177 cout << "bfs and dfs iterator demo on the reversed directed graph" << endl; |
234 for(GW::EachNodeIt n=wG.first<GW::EachNodeIt>(); wG.valid(n); wG.next(n)) { |
178 for(GW::NodeIt n=wG.first<GW::NodeIt>(); wG.valid(n); wG.next(n)) { |
235 cout << node_name.get(n) << ": "; |
179 cout << node_name.get(n) << ": "; |
236 cout << "out edges: "; |
180 cout << "out edges: "; |
237 for(GW::OutEdgeIt e=wG.first<GW::OutEdgeIt>(n); wG.valid(e); wG.next(e)) |
181 for(GW::OutEdgeIt e=wG.first<GW::OutEdgeIt>(n); wG.valid(e); wG.next(e)) |
238 cout << edge_name.get(e) << " "; |
182 cout << edge_name.get(e) << " "; |
239 cout << "in edges: "; |
183 cout << "in edges: "; |
298 cout << endl; |
242 cout << endl; |
299 } |
243 } |
300 } |
244 } |
301 |
245 |
302 { |
246 { |
303 typedef UndirGraphWrapper<const ListGraph> GW; |
247 typedef UndirGraphWrapper<const Graph> GW; |
304 GW wG(G); |
248 GW wG(G); |
305 |
249 |
306 EdgeNameMap< GW, ListGraph::NodeMap<string> > edge_name(wG, node_name); |
250 EdgeNameMap< GW, Graph::NodeMap<string> > edge_name(wG, node_name); |
307 |
251 |
308 cout << "bfs and dfs iterator demo on the undirected graph" << endl; |
252 cout << "bfs and dfs iterator demo on the undirected graph" << endl; |
309 for(GW::EachNodeIt n=wG.first<GW::EachNodeIt>(); wG.valid(n); wG.next(n)) { |
253 for(GW::NodeIt n=wG.first<GW::NodeIt>(); wG.valid(n); wG.next(n)) { |
310 cout << node_name.get(n) << ": "; |
254 cout << node_name.get(n) << ": "; |
311 cout << "out edges: "; |
255 cout << "out edges: "; |
312 for(GW::OutEdgeIt e=wG.first<GW::OutEdgeIt>(n); wG.valid(e); wG.next(e)) |
256 for(GW::OutEdgeIt e=wG.first<GW::OutEdgeIt>(n); wG.valid(e); wG.next(e)) |
313 cout << edge_name.get(e) << " "; |
257 cout << edge_name.get(e) << " "; |
314 cout << "in edges: "; |
258 cout << "in edges: "; |