Add a cost scaling min cost flow algorithm.
Add a cost scaling algorithm, which is performing generalized
push-relabel operations. It is almost as efficient as the capacity
scaling algorithm, but slower than network simplex.
3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2008
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
21 #include <lemon/smart_graph.h>
22 #include <lemon/graph_reader.h>
23 #include <lemon/ugraph_adaptor.h>
24 #include <lemon/graph_to_eps.h>
25 #include <lemon/dfs.h>
26 #include <lemon/topology.h>
31 /// \brief Strongly connected orientation
33 /// This example demonstrates the usage of the DirUGraphAdaptor,
34 /// the DfsVisitor and some topology functions. The program reads
35 /// an input undirected graph and with a DfsVisit it orients each edge
36 /// to minimize the strongly connected components in the graph. At least
37 /// it checks the result of the orientation with to topology functions.
39 /// \include strongly_connected_orientation.cc
41 using namespace lemon;
44 typedef SmartUGraph UGraph;
45 UGRAPH_TYPEDEFS(UGraph);
48 return c ? BLACK : RED;
51 template <typename DirMap>
52 class OrientVisitor : public DfsVisitor<UGraph> {
55 OrientVisitor(const UGraph& ugraph, DirMap& dirMap)
56 : _ugraph(ugraph), _dirMap(dirMap), _processed(ugraph, false) {}
58 void discover(const Edge& edge) {
59 _processed.set(edge, true);
60 _dirMap.set(edge, _ugraph.direction(edge));
63 void examine(const Edge& edge) {
64 if (_processed[edge]) return;
65 _processed.set(edge, true);
66 _dirMap.set(edge, _ugraph.direction(edge));
70 const UGraph& _ugraph;
72 UGraph::UEdgeMap<bool> _processed;
77 cout << "Orientation of the strongly_connected_orientation.lgf "
78 << "to be strongly connected" << endl;
81 UGraph::NodeMap<dim2::Point<double> > coords(ugraph);
82 UGraphReader<UGraph>("strongly_connected_orientation.lgf", ugraph).
83 readNodeMap("coords", coords).run();
85 UGraph::UEdgeMap<bool> dmap(ugraph);
87 typedef OrientVisitor<UGraph::UEdgeMap<bool> > Visitor;
88 Visitor visitor(ugraph, dmap);
90 DfsVisit<UGraph, Visitor> dfs(ugraph, visitor);
94 typedef DirUGraphAdaptor<UGraph> DGraph;
95 DGraph dgraph(ugraph, dmap);
97 cout << "The result written into the "
98 << "strongly_connected_orientation.eps file" << endl;
100 graphToEps(dgraph, "strongly_connected_orientation.eps").
101 drawArrows().coords(coords).scaleToA4().enableParallel().
102 autoNodeScale().autoEdgeWidthScale().run();
104 int num_scc = countStronglyConnectedComponents(dgraph);
105 int num_becc = countBiEdgeConnectedComponents(ugraph);
107 if (num_scc != num_becc) {
108 std::cerr << "Wrong Orientation" << std::endl;