if you have a nuclear power plant and wanna compute small magic squares, then let's do it
4 #include <lemon/list_graph.h>
5 #include <lemon/smart_graph.h>
6 #include <lemon/dimacs.h>
7 #include <lemon/preflow.h>
8 #include <lemon/full_graph.h>
9 #include <merge_node_graph_wrapper.h>
11 #include<lemon/concept_check.h>
12 #include<lemon/concept/graph.h>
17 using namespace lemon;
18 using namespace lemon::concept;
20 class Graph3 : ListGraph {
22 class Node : public ListGraph::Node { };
26 template <typename Graph>
27 void printGraph(const Graph& g) {
28 cout << " nodes:" << endl;
29 for (typename Graph::NodeIt n(g); n!=INVALID; ++n) {
30 cout << " " << g.id(n) << ": out edges:" << endl;
31 for (typename Graph::OutEdgeIt e(g, n); e!=INVALID; ++e)
32 cout << " " << g.id(g.source(e)) << "->" << g.id(g.target(e)) << endl;
34 cout << " edges:" << endl;
35 for (typename Graph::EdgeIt e(g); e!=INVALID; ++e) {
36 cout << " " << g.id(e) << ": "
37 << g.id(g.source(e)) << "->" << g.id(g.target(e)) << endl;
43 cout << "FIRST TEST" << endl;
44 //typedef SmartGraph Graph1;
45 typedef ListGraph Graph1;
46 typedef ListGraph Graph2;
47 typedef SmartGraph Graph3;
50 // checkConcept<StaticGraph, MergeEdgeGraphWrapper<Graph1, Graph2> >();
51 // MergeEdgeGraphWrapper<Graph1, Graph2>::printNode();
52 // MergeEdgeGraphWrapper<Graph1, Graph2>::printEdge();
53 // checkConcept<StaticGraph, MergeEdgeGraphWrapper<Graph1, Graph1> >();
54 // MergeEdgeGraphWrapper<Graph1, Graph1>::printNode();
55 // MergeEdgeGraphWrapper<Graph1, Graph1>::printEdge();
56 // typedef ResGraphWrapper<Graph1, int,
57 // ConstMap<Graph1, int>, ConstMap<Graph1, int> > Graph4;
58 // checkConcept<StaticGraph, MergeEdgeGraphWrapper<Graph1, Graph4> >();
59 // MergeEdgeGraphWrapper<Graph1, Graph4>::printNode();
60 // MergeEdgeGraphWrapper<Graph1, Graph4>::printEdge();
61 // checkConcept<StaticGraph, MergeEdgeGraphWrapper<Graph4, Graph1> >();
62 // MergeEdgeGraphWrapper<Graph4, Graph1>::printNode();
63 // MergeEdgeGraphWrapper<Graph4, Graph1>::printEdge();
68 typedef MergeEdgeGraphWrapper<Graph1, Graph2> GW;
72 Graph1::EdgeMap<int> cap1(g1);
73 Graph2::EdgeMap<int> cap2(g2);
75 std::ifstream f1("graph1.dim");
76 std::ifstream f2("graph2.dim");
80 // GW::NodeMap<int> ize(gw, 8);
81 // for (GW::NodeIt n(gw); n!=INVALID; ++n) ize.set(n, 9);
82 // GW::EdgeMap<int> mize(gw, 8);
83 // for (GW::EdgeIt n(gw); n!=INVALID; ++n) mize.set(n, 7);
85 // std::ifstream f1("flow-1.dim");
86 // std::ifstream f2("flow2.dim");
87 // readDimacs(f1, g1, cap1, s1, t1);
88 // readDimacs(f2, g2, cap2, s2, t2);
90 // GW::EdgeMap<int> cap(gw);
91 // for (GW::EdgeIt e(gw); e!=INVALID; ++e) {
92 // if (gw.forward(e)) cap.set(e, cap1[e]);
93 // if (gw.backward(e)) cap.set(e, cap2[e]);
97 // GW::EdgeMap<int> flow(gw, 0);
98 // Preflow<GW, int> preflow(gw, GW::Node(s1, INVALID, false),
99 // GW::Node(t1, INVALID, false), cap, flow);
101 // std::cout << "s1->t1: " << preflow.flowValue() << std::endl;
104 // GW::EdgeMap<int> flow(gw, 0);
105 // Preflow<GW, int> preflow(gw, GW::Node(INVALID, s2, true),
106 // GW::Node(INVALID, t2, true), cap, flow);
108 // std::cout << "s2->t2: " << preflow.flowValue() << std::endl;
111 // GW::EdgeMap<int> flow(gw, 0);
112 // Preflow<GW, int> preflow(gw, GW::Node(s1, INVALID, false),
113 // GW::Node(INVALID, t2, true), cap, flow);
115 // std::cout << "s1->t2: " << preflow.flowValue() << std::endl;
118 // GW::EdgeMap<int> flow(gw, 0);
119 // Preflow<GW, int> preflow(gw, GW::Node(INVALID, s2, true),
120 // GW::Node(s1, INVALID, false), cap, flow);
122 // std::cout << "s2->t1: " << preflow.flowValue() << std::endl;
124 cout << "1st graph" << endl;
127 cout << "2nd graph" << endl;
130 cout << "merged graph" << endl;
133 // for (GW::NodeIt n(gw); n!=INVALID; ++n)
134 // std::cout << ize[n] << std::endl;
135 // for (GW::EdgeIt n(gw); n!=INVALID; ++n)
136 // std::cout << mize[n] << std::endl;
138 typedef NewEdgeSetGraphWrapper2<GW, Graph3> GWW;
140 // checkConcept<StaticGraph, GWW>();
145 cout << "new edges graph" << endl;
156 cout << "new edges graph" << endl;
159 typedef AugmentingGraphWrapper<GW, GWW> GWWW;
161 // checkConcept<StaticGraph, GWWW>();
165 cout << "fully merged graph" << endl;
171 cout << "SECOND TEST" << endl;
172 typedef SmartGraph Graph1;
174 // checkConcept<StaticGraph, Graph1>();
180 ConstMap<FullGraph::Edge, bool> const_false_map(false);
181 typedef EdgeSubGraphWrapper<FullGraph, ConstMap<FullGraph::Edge, bool> >
184 // checkConcept<StaticGraph, Graph2>();
187 Graph2 g2(pre_g2, const_false_map);
189 typedef MergeEdgeGraphWrapper<Graph1, Graph2> GW;
191 // checkConcept<StaticGraph, GW>();
197 Graph2::NodeIt k(g2);
198 sw=GW::Node(INVALID, k, true);
200 tw=GW::Node(INVALID, k, true);
203 std::ifstream f1("graph2.dim");
206 cout << "1st graph" << endl;
209 cout << "2nd graph" << endl;
212 cout << "merged graph" << endl;
215 typedef ListGraph Graph3;
216 //typedef SmartGraph Graph3;
218 GW::NodeMap<Graph3::Node> gwn(gw);
219 Graph3::NodeMap<GW::Node> g3n(g3);
220 for (GW::NodeIt n(gw); n!=INVALID; ++n) {
221 Graph3::Node m=g3.addNode();
226 typedef NewEdgeSetGraphWrapper<GW, Graph3> GWW;
228 // checkConcept<StaticGraph, GWW>();
231 GWW gww(gw, g3, gwn, g3n);
233 for (Graph1::NodeIt n(g1); n!=INVALID; ++n) {
234 g3.addEdge(gwn[sw], gwn[GW::Node(n,INVALID,false)]);
237 // for (Graph1::NodeIt n(g1); n!=INVALID; ++n) {
238 // gww.addEdge(sw, GW::Node(n,INVALID,false));
241 cout << "new edges" << endl;
244 cout << "new edges in the new graph" << endl;
247 typedef AugmentingGraphWrapper<GW, GWW> GWWW;
249 // checkConcept<StaticGraph, GWWW>();
253 cout << "new edges merged into the original graph" << endl;