Correcting the structure of the graph's and adaptor's map.
The template assign operators and map iterators can be used for adaptors also.
Some bugfix in the adaptors
New class SwapBpUGraphAdaptor which swaps the two nodeset of the graph.
3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2006
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
25 #include <lemon/smart_graph.h>
26 #include <lemon/dijkstra.h>
27 #include <lemon/floyd_warshall.h>
28 #include <lemon/johnson.h>
30 #include <lemon/fib_heap.h>
32 #include <lemon/time_measure.h>
33 #include "test_tools.h"
35 using namespace lemon;
38 int main(int argc, const char *argv[]) {
40 typedef SmartGraph Graph;
41 typedef Graph::Node Node;
42 typedef Graph::Edge Edge;
43 typedef Graph::NodeIt NodeIt;
44 typedef Graph::EdgeIt EdgeIt;
46 typedef Graph::EdgeMap<double> LengthMap;
47 typedef Graph::NodeMap<double> DistMap;
49 const int n = argc > 1 ? atoi(argv[1]) : 20;
50 const int e = argc > 2 ? atoi(argv[2]) : (int)(n * log((double)n));
51 const double m = argc > 3 ? (double)atoi(argv[3]) : 100.0;
54 LengthMap length(graph);
58 for (int i = 0; i < n; ++i) {
59 Node node = graph.addNode();
60 nodes.push_back(node);
61 shift[node] = m * (double)rand() / (RAND_MAX + 1.0);
64 for (int i = 0; i < e; ++i) {
65 int s = (int)(n * (double)rand() / (RAND_MAX + 1.0));
66 int t = (int)(n * (double)rand() / (RAND_MAX + 1.0));
67 double c = m * (double)rand() / (RAND_MAX + 1.0);
68 Edge edge = graph.addEdge(nodes[s], nodes[t]);
69 length[edge] = c - shift[nodes[s]] + shift[nodes[t]];
72 Johnson<Graph, LengthMap> johnson(graph, length);
76 cout << "Johnson: " << timer << endl;
79 typedef FibHeap<Node, double, Graph::NodeMap<int> > DoubleFibHeap;
80 Johnson<Graph, LengthMap>::DefStandardHeap<DoubleFibHeap>
81 ::Create fibJohnson(graph, length);
85 cout << "Johnson with fibonacci heap: " << timer << endl;
88 FloydWarshall<Graph, LengthMap> floyd(graph, length);
92 cout << "FloydWarshall: " << timer << endl;
95 for (NodeIt it(graph); it != INVALID; ++it) {
96 for (NodeIt jt(graph); jt != INVALID; ++jt) {
97 check(johnson.connected(it, jt) == floyd.connected(it, jt),
98 "Wrong connection in all pairs shortest path");
99 check(johnson.connected(it, jt) == fibJohnson.connected(it, jt),
100 "Wrong connection in all pairs shortest path");
101 if (johnson.connected(it, jt)) {
102 check(johnson.dist(it, jt) == floyd.dist(it, jt),
103 "Wrong distance in all pairs shortest path");
104 check(johnson.dist(it, jt) == fibJohnson.dist(it, jt),
105 "Wrong distance in all pairs shortest path");
107 check(johnson.dist(it, jt) ==
108 johnson.dist(it, johnson.predNode(it, jt)) +
109 length[johnson.predEdge(it, jt)],
110 "Wrong edge in all pairs shortest path");
111 check(fibJohnson.dist(it, jt) ==
112 fibJohnson.dist(it, fibJohnson.predNode(it, jt)) +
113 length[fibJohnson.predEdge(it, jt)],
114 "Wrong edge in all pairs shortest path");
115 check(floyd.dist(it, jt) ==
116 floyd.dist(it, floyd.predNode(it, jt)) +
117 length[floyd.predEdge(it, jt)],
118 "Wrong edge in all pairs shortest path");