COIN-OR::LEMON - Graph Library

source: lemon-0.x/demo/disjoint_paths.cc @ 2081:94a7deb46c07

Last change on this file since 2081:94a7deb46c07 was 2081:94a7deb46c07, checked in by Balazs Dezso, 18 years ago

New demo file for computing disjoint paths

Doc review

Correcting misformatting in adaptors
Adding header to demos

File size: 3.2 KB
Line 
1/* -*- C++ -*-
2 *
3 * This file is a part of LEMON, a generic C++ optimization library
4 *
5 * Copyright (C) 2003-2006
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 *
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.
12 *
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
15 * purpose.
16 *
17 */
18
19/// \ingroup demos
20/// \file
21/// \brief Node and edge disjoint paths in directed graph.
22///
23/// This demo program calculates how many edge disjoint and node disjoint
24/// paths are in a directed graph between a source and a target node.
25/// The edge disjoint paths can be computed with a flow algorithm,
26/// in this example we use the Preflow algorithm class. To get the node
27/// disjoint paths we should first adapt the graph with the SplitGraphAdaptor
28/// and just then calculate the flow. 
29///
30/// \include disjoint_paths.cc
31
32#include <iostream>
33
34#include <lemon/smart_graph.h>
35#include <lemon/graph_adaptor.h>
36#include <lemon/graph_reader.h>
37#include <lemon/preflow.h>
38#include <lemon/graph_to_eps.h>
39
40using namespace lemon;
41using namespace std;
42
43Color color(bool b) {
44  return b ? Color(1.0, 0.0, 0.0) : Color(0.0, 0.0, 0.0);
45}
46
47int main() {
48  cout << "This program calculates the number " <<
49    "of disjoint paths in a graph" << endl;
50  cout << "The graph is read from the disjoint_paths.lgf file" << endl;
51  typedef SmartGraph Graph;
52
53  Graph graph;
54
55  Graph::NodeMap<xy<double> > coords(graph);
56  Graph::Node source, target;
57  GraphReader<Graph>("disjoint_paths.lgf", graph).
58    readNodeMap("coords", coords).
59    readNode("source", source).readNode("target", target).run();
60
61  typedef ConstMap<Graph::Edge, int> Capacity;
62  Capacity capacity(1);
63
64  Graph::EdgeMap<int> flow(graph);
65
66  Preflow<Graph, int, Capacity> preflow(graph, source, target, capacity, flow);
67 
68  preflow.run();
69
70  cout << "Number of edge disjoint paths: " << preflow.flowValue() << endl;
71
72  graphToEps(graph, "edge_disjoint.eps").
73    title("edge disjoint path").copyright("(C) 2006 LEMON Project").drawArrows().
74    edgeColors(composeMap(functorMap(color), flow)).
75    coords(coords).autoNodeScale().run();
76
77
78  cout << "The paths are written into edge_disjoint.eps" << endl;
79
80  typedef SplitGraphAdaptor<SmartGraph> SGraph;
81
82  SGraph sgraph(graph);
83
84  typedef ConstMap<SGraph::Edge, int> SCapacity;
85  SCapacity scapacity(1);
86
87  SGraph::EdgeMap<int> sflow(sgraph);
88
89  Preflow<SGraph, int, SCapacity> spreflow(sgraph, SGraph::outNode(source),
90                                           SGraph::inNode(target),
91                                           scapacity, sflow);
92
93  spreflow.run();
94
95  cout << "Number of node disjoint paths: " << spreflow.flowValue() << endl;
96
97
98  graphToEps(sgraph, "node_disjoint.eps").
99    title("node disjoint path").copyright("(C) 2006 LEMON Project").drawArrows().
100    edgeColors(composeMap(functorMap(color), sflow)).
101    coords(SGraph::combinedNodeMap(coords, shiftMap(coords, xy<double>(5, 0)))).
102    autoNodeScale().run();
103
104  cout << "The paths are written into node_disjoint.eps" << endl;
105 
106  return 0;
107}
Note: See TracBrowser for help on using the repository browser.