|         |      1 #include <iostream> | 
|         |      2 #include <vector> | 
|         |      3 #include <string> | 
|         |      4  | 
|         |      5 #include <list_graph.h> | 
|         |      6 #include <bfs_iterator.h> | 
|         |      7 #include <edmonds_karp.h> | 
|         |      8  | 
|         |      9 using namespace hugo; | 
|         |     10  | 
|         |     11 int main (int, char*[]) | 
|         |     12 { | 
|         |     13   typedef ListGraph::Node Node; | 
|         |     14   typedef ListGraph::Edge Edge; | 
|         |     15   typedef ListGraph::NodeIt NodeIt; | 
|         |     16   typedef ListGraph::EdgeIt EdgeIt; | 
|         |     17   typedef ListGraph::OutEdgeIt OutEdgeIt; | 
|         |     18   typedef ListGraph::InEdgeIt InEdgeIt; | 
|         |     19   typedef ListGraph::SymEdgeIt SymEdgeIt; | 
|         |     20   ListGraph G; | 
|         |     21   std::vector<Node> vector_of_Nodes; | 
|         |     22   for(int i=0; i!=8; ++i) vector_of_Nodes.push_back(G.addNode()); | 
|         |     23   for(int i=0; i!=8; ++i) | 
|         |     24     for(int j=0; j!=8; ++j)  | 
|         |     25       if ((i<j)&&(i+j)%3) G.addEdge(vector_of_Nodes[i], vector_of_Nodes[j]); | 
|         |     26  | 
|         |     27   std::cout << "We construct a directed graph on the node set {0,1,2,...,7}," <<std::endl << "i-->j is arc iff i<j and (i+j)%3." << std::endl; | 
|         |     28   std::cout << "number of nodes: " << count(G.first<NodeIt>()) << std::endl; | 
|         |     29  | 
|         |     30   for(NodeIt i=G.first<NodeIt>(); G.valid(i); G.next(i)) { | 
|         |     31     std::cout << "node " << G.id(i) << std::endl; | 
|         |     32     std::cout << " outdegree (OutEdgeIt): " << count(G.first<OutEdgeIt>(i)) << " ";  | 
|         |     33     for(OutEdgeIt j=G.first<OutEdgeIt>(i); G.valid(j); G.next(j)) {  | 
|         |     34       std::cout << "(" << G.id(G.tail(j)) << "--" << G.id(j) << "->" << G.id(G.head(j)) << ") "; | 
|         |     35     } | 
|         |     36     std::cout << std::endl;  | 
|         |     37  | 
|         |     38     std::cout<< " "; | 
|         |     39     for(OutEdgeIt j=G.first<OutEdgeIt>(i); G.valid(j); G.next(j)) {  | 
|         |     40       std::cout << G.aNode(j) << "->" << G.bNode(j) << " "; }  | 
|         |     41     std::cout<<std::endl; | 
|         |     42  | 
|         |     43     std::cout << " indegree: (InEdgeIt) " << count(G.first<InEdgeIt>(i)) << " "; | 
|         |     44     for(InEdgeIt j=G.first<InEdgeIt>(i); G.valid(j); G.next(j)) {  | 
|         |     45       std::cout << j << " "; }  | 
|         |     46     std::cout << std::endl; | 
|         |     47  | 
|         |     48     std::cout<< " "; | 
|         |     49     for(InEdgeIt j=G.first<InEdgeIt>(i); G.valid(j); G.next(j)) {  | 
|         |     50       std::cout << G.aNode(j) << "->" << G.bNode(j) << " "; }  | 
|         |     51     std::cout<<std::endl; | 
|         |     52  | 
|         |     53     std::cout << " degree: (SymEdgeIt) " << count(G.first<SymEdgeIt>(i)) << " "; | 
|         |     54     for(SymEdgeIt j=G.first<SymEdgeIt>(i); G.valid(j); G.next(j)) {  | 
|         |     55       std::cout << j << " "; }  | 
|         |     56     std::cout<<std::endl; | 
|         |     57  | 
|         |     58     std::cout<< " "; | 
|         |     59     for(SymEdgeIt j=G.first<SymEdgeIt>(i); G.valid(j); G.next(j)) {  | 
|         |     60       std::cout << G.aNode(j) << "->" << G.bNode(j) << " "; }  | 
|         |     61     std::cout<<std::endl; | 
|         |     62   } | 
|         |     63  | 
|         |     64   std::cout << "all edges: "; | 
|         |     65   for(EdgeIt i=G.first<EdgeIt>(); G.valid(i); G.next(i)) { | 
|         |     66     std::cout << i << " "; | 
|         |     67   } | 
|         |     68   std::cout << std::endl; | 
|         |     69  | 
|         |     70   std::cout << "node property array test" << std::endl; | 
|         |     71   ListGraph::NodeMap<int> my_property_vector(G); | 
|         |     72   NodeIt v; | 
|         |     73   G.first(v); | 
|         |     74   my_property_vector.set(v, 42); | 
|         |     75   my_property_vector.set(G.next(G.first<NodeIt>()), 314); | 
|         |     76   my_property_vector.set(G.next(G.next(G.first<NodeIt>())), 1956); | 
|         |     77   my_property_vector.set(vector_of_Nodes[3], 1989); | 
|         |     78   my_property_vector.set(vector_of_Nodes[4], 2003); | 
|         |     79   my_property_vector.set(vector_of_Nodes[7], 1978); | 
|         |     80   std::cout << "some node property values..." << std::endl; | 
|         |     81   for(NodeIt i=G.first<NodeIt>(); G.valid(i); G.next(i)) { | 
|         |     82     std::cout << my_property_vector.get(i) << std::endl; | 
|         |     83   } | 
|         |     84   int _i=1; | 
|         |     85   int _ii=1; | 
|         |     86   ListGraph::EdgeMap<int> my_edge_property(G); | 
|         |     87   for(EdgeIt i=G.first<EdgeIt>(); G.valid(i); G.next(i)) { | 
|         |     88     my_edge_property.set(i, _i); | 
|         |     89     _i*=_ii; ++_ii; | 
|         |     90   } | 
|         |     91  | 
|         |     92   std::cout << "node and edge property values on the tails and heads of edges..." << std::endl; | 
|         |     93   for(EdgeIt j=G.first<EdgeIt>(); G.valid(j); G.next(j)) { | 
|         |     94     std::cout << my_property_vector.get(G.tail(j)) << "--" << my_edge_property.get(j) << "-->" << my_property_vector.get(G.head(j)) << " "; | 
|         |     95   } | 
|         |     96   std::cout << std::endl; | 
|         |     97 /* | 
|         |     98   std::cout << "bfs from the first node" << std::endl; | 
|         |     99   bfs<ListGraph> bfs_test(G, G.first<NodeIt>()); | 
|         |    100   bfs_test.run(); | 
|         |    101   std::cout << "reached: "; | 
|         |    102   for(NodeIt i=G.first<NodeIt>(); G.valid(i); G.next(i)) { | 
|         |    103     std::cout << bfs_test.reached.get(i) << " "; | 
|         |    104   } | 
|         |    105   std::cout<<std::endl; | 
|         |    106   std::cout << "dist: "; | 
|         |    107   for(NodeIt i=G.first<NodeIt>(); G.valid(i); G.next(i)) { | 
|         |    108     std::cout << bfs_test.dist.get(i) << " "; | 
|         |    109   } | 
|         |    110   std::cout<<std::endl; | 
|         |    111 */ | 
|         |    112  | 
|         |    113   std::cout << "augmenting path flow algorithm test..." << std::endl; | 
|         |    114   ListGraph flowG; | 
|         |    115  | 
|         |    116   Node s=flowG.addNode(); | 
|         |    117   Node v1=flowG.addNode(); | 
|         |    118   Node v2=flowG.addNode(); | 
|         |    119   Node v3=flowG.addNode(); | 
|         |    120   Node v4=flowG.addNode(); | 
|         |    121   Node t=flowG.addNode(); | 
|         |    122    | 
|         |    123   ListGraph::NodeMap<std::string> node_name(flowG); | 
|         |    124   node_name.set(s, "s"); | 
|         |    125   node_name.set(v1, "v1"); | 
|         |    126   node_name.set(v2, "v2"); | 
|         |    127   node_name.set(v3, "v3"); | 
|         |    128   node_name.set(v4, "v4"); | 
|         |    129   node_name.set(t, "t"); | 
|         |    130  | 
|         |    131   Edge s_v1=flowG.addEdge(s, v1); | 
|         |    132   Edge s_v2=flowG.addEdge(s, v2); | 
|         |    133   Edge v1_v2=flowG.addEdge(v1, v2); | 
|         |    134   Edge v2_v1=flowG.addEdge(v2, v1); | 
|         |    135   Edge v1_v3=flowG.addEdge(v1, v3); | 
|         |    136   Edge v3_v2=flowG.addEdge(v3, v2); | 
|         |    137   Edge v2_v4=flowG.addEdge(v2, v4); | 
|         |    138   Edge v4_v3=flowG.addEdge(v4, v3); | 
|         |    139   Edge v3_t=flowG.addEdge(v3, t); | 
|         |    140   Edge v4_t=flowG.addEdge(v4, t); | 
|         |    141  | 
|         |    142   ListGraph::EdgeMap<int> cap(flowG); | 
|         |    143  | 
|         |    144   cap.set(s_v1, 16); | 
|         |    145   cap.set(s_v2, 13); | 
|         |    146   cap.set(v1_v2, 10); | 
|         |    147   cap.set(v2_v1, 4); | 
|         |    148   cap.set(v1_v3, 12); | 
|         |    149   cap.set(v3_v2, 9); | 
|         |    150   cap.set(v2_v4, 14); | 
|         |    151   cap.set(v4_v3, 7); | 
|         |    152   cap.set(v3_t, 20); | 
|         |    153   cap.set(v4_t, 4); | 
|         |    154  | 
|         |    155   std::cout << "on directed graph graph" << std::endl; //<< flowG; | 
|         |    156   std::cout << "names and capacity values" << std::endl;  | 
|         |    157   for(NodeIt i=flowG.first<NodeIt>(); flowG.valid(i); flowG.next(i)) {  | 
|         |    158     std::cout << node_name.get(i) << ": "; | 
|         |    159     std::cout << "out edges: "; | 
|         |    160     for(OutEdgeIt j=flowG.first<OutEdgeIt>(i); flowG.valid(j); flowG.next(j))  | 
|         |    161       std::cout << node_name.get(flowG.tail(j)) << "-"<< cap.get(j) << "->" << node_name.get(flowG.head(j)) << " "; | 
|         |    162     std::cout << "in edges: "; | 
|         |    163     for(InEdgeIt j=flowG.first<InEdgeIt>(i); flowG.valid(j); flowG.next(j))  | 
|         |    164       std::cout << node_name.get(flowG.tail(j)) << "-"<< cap.get(j) << "->" << node_name.get(flowG.head(j)) << " "; | 
|         |    165     std::cout << std::endl; | 
|         |    166   } | 
|         |    167  | 
|         |    168   //flowG.deleteEdge(s_v1); | 
|         |    169   //flowG.deleteEdge(s_v2); | 
|         |    170   //flowG.deleteEdge(v1_v2); | 
|         |    171   //flowG.deleteEdge(v1_v3); | 
|         |    172    | 
|         |    173  | 
|         |    174   //flowG.setTail(v3_t, v2); | 
|         |    175   //flowG.setHead(v3_t, s); | 
|         |    176 /* | 
|         |    177   for(NodeIt i=flowG.first<NodeIt>(); flowG.valid(i); flowG.next(i)) {  | 
|         |    178     std::cout << node_name.get(i) << ": "; | 
|         |    179     std::cout << "out edges: "; | 
|         |    180     for(OutEdgeIt j=flowG.first<OutEdgeIt>(i); flowG.valid(j); flowG.next(j))  | 
|         |    181       std::cout << node_name.get(flowG.tail(j)) << "-"<< cap.get(j) << "->" << node_name.get(flowG.head(j)) << " "; | 
|         |    182     std::cout << "in edges: "; | 
|         |    183     for(InEdgeIt j=flowG.first<InEdgeIt>(i); flowG.valid(j); flowG.next(j))  | 
|         |    184       std::cout << node_name.get(flowG.tail(j)) << "-"<< cap.get(j) << "->" << node_name.get(flowG.head(j)) << " "; | 
|         |    185     std::cout << std::endl; | 
|         |    186   } | 
|         |    187    | 
|         |    188   for(EdgeIt e=flowG.first<EdgeIt>(); flowG.valid(e); flowG.next(e)) { | 
|         |    189     std::cout << node_name.get(flowG.tail(e)) << "-"<< cap.get(e) << "->" << node_name.get(flowG.head(e)) << " "; | 
|         |    190   } | 
|         |    191 */ | 
|         |    192   /* | 
|         |    193   while (flowG.valid(flowG.first<EdgeIt>())) { | 
|         |    194     flowG.deleteEdge(flowG.first<EdgeIt>()); | 
|         |    195     for(NodeIt i=flowG.first<NodeIt>(); flowG.valid(i); flowG.next(i)) {  | 
|         |    196       std::cout << node_name.get(i) << ": "; | 
|         |    197       std::cout << "out edges: "; | 
|         |    198       for(OutEdgeIt j=flowG.first<OutEdgeIt>(i); flowG.valid(j); flowG.next(j))  | 
|         |    199 	std::cout << node_name.get(flowG.tail(j)) << "-"<< cap.get(j) << "->" << node_name.get(flowG.head(j)) << " "; | 
|         |    200       std::cout << "in edges: "; | 
|         |    201       for(InEdgeIt j=flowG.first<InEdgeIt>(i); flowG.valid(j); flowG.next(j))  | 
|         |    202 	std::cout << node_name.get(flowG.tail(j)) << "-"<< cap.get(j) << "->" << node_name.get(flowG.head(j)) << " "; | 
|         |    203       std::cout << std::endl; | 
|         |    204     } | 
|         |    205   } | 
|         |    206    | 
|         |    207   while (flowG.valid(flowG.first<NodeIt>())) { | 
|         |    208     flowG.deleteNode(flowG.first<NodeIt>()); | 
|         |    209     for(NodeIt i=flowG.first<NodeIt>(); flowG.valid(i); flowG.next(i)) {  | 
|         |    210       std::cout << node_name.get(i) << ": "; | 
|         |    211       std::cout << "out edges: "; | 
|         |    212       for(OutEdgeIt j=flowG.first<OutEdgeIt>(i); flowG.valid(j); flowG.next(j))  | 
|         |    213 	std::cout << node_name.get(flowG.tail(j)) << "-"<< cap.get(j) << "->" << node_name.get(flowG.head(j)) << " "; | 
|         |    214       std::cout << "in edges: "; | 
|         |    215       for(InEdgeIt j=flowG.first<InEdgeIt>(i); flowG.valid(j); flowG.next(j))  | 
|         |    216 	std::cout << node_name.get(flowG.tail(j)) << "-"<< cap.get(j) << "->" << node_name.get(flowG.head(j)) << " "; | 
|         |    217       std::cout << std::endl; | 
|         |    218     } | 
|         |    219   } | 
|         |    220   */ | 
|         |    221  | 
|         |    222   //std::cout << std::endl; | 
|         |    223  | 
|         |    224  | 
|         |    225   { | 
|         |    226     ListGraph::EdgeMap<int> flow(flowG, 0); | 
|         |    227     MaxFlow<ListGraph, int, ListGraph::EdgeMap<int>, ListGraph::EdgeMap<int> > max_flow_test(flowG, s, t, flow, cap); | 
|         |    228     /* | 
|         |    229     max_flow_test.augmentOnBlockingFlow<ListGraph>(); | 
|         |    230     for(EdgeIt e=flowG.template first<EdgeIt>(); flowG.valid(e); flowG.next(e)) {  | 
|         |    231       std::cout<<"("<<flowG.tail(e)<< "-"<<flow.get(e)<<"->"<<flowG.head(e)<<") "; | 
|         |    232     } | 
|         |    233     std::cout<<std::endl; | 
|         |    234     max_flow_test.augmentOnBlockingFlow<ListGraph>(); | 
|         |    235     for(EdgeIt e=flowG.template first<EdgeIt>(); flowG.valid(e); flowG.next(e)) {  | 
|         |    236       std::cout<<"("<<flowG.tail(e)<< "-"<<flow.get(e)<<"->"<<flowG.head(e)<<") "; | 
|         |    237     } | 
|         |    238     std::cout<<std::endl;*/ | 
|         |    239     //max_flow_test.run(); | 
|         |    240      | 
|         |    241     //std::cout << "maximum flow: "<< std::endl; | 
|         |    242     while (max_flow_test.augmentOnShortestPath()) { | 
|         |    243       for(EdgeIt e=flowG.template first<EdgeIt>(); flowG.valid(e); flowG.next(e)) {  | 
|         |    244 	std::cout<<"("<<flowG.tail(e)<< "-"<<flow.get(e)<<"->"<<flowG.head(e)<<") "; | 
|         |    245       } | 
|         |    246       std::cout<<std::endl; | 
|         |    247     } | 
|         |    248     std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; | 
|         |    249   } | 
|         |    250 /* | 
|         |    251   { | 
|         |    252     std::list<Node> S; | 
|         |    253     S.push_back(s); S.push_back(v3); | 
|         |    254     std::list<Node> T; | 
|         |    255     T.push_back(t); | 
|         |    256  | 
|         |    257     ListGraph::EdgeMap<int> flow(flowG, 0); | 
|         |    258     MaxFlow2<ListGraph, int, ListGraph::EdgeMap<int>, ListGraph::EdgeMap<int> > max_flow_test(flowG, S, T, flow, cap); | 
|         |    259     max_flow_test.run(); | 
|         |    260      | 
|         |    261     std::cout << "maximum flow: "<< std::endl; | 
|         |    262     for(EdgeIt e=flowG.template first<EdgeIt>(); flowG.valid(e); flowG.next(e)) {  | 
|         |    263       std::cout<<"("<<flowG.tail(e)<< "-"<<flow.get(e)<<"->"<<flowG.head(e)<<") "; | 
|         |    264     } | 
|         |    265     std::cout<<std::endl; | 
|         |    266     std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; | 
|         |    267   } | 
|         |    268 */ | 
|         |    269   return 0; | 
|         |    270 } |