summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/graph/test/bellman-test.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 18:24:20 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 18:24:20 +0000
commit483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch)
treee5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/boost/libs/graph/test/bellman-test.cpp
parentInitial commit. (diff)
downloadceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.tar.xz
ceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.zip
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/graph/test/bellman-test.cpp')
-rw-r--r--src/boost/libs/graph/test/bellman-test.cpp109
1 files changed, 109 insertions, 0 deletions
diff --git a/src/boost/libs/graph/test/bellman-test.cpp b/src/boost/libs/graph/test/bellman-test.cpp
new file mode 100644
index 00000000..a285b31d
--- /dev/null
+++ b/src/boost/libs/graph/test/bellman-test.cpp
@@ -0,0 +1,109 @@
+// (C) Copyright Jeremy Siek 2004
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// From Louis Lavery <Louis@devilsChimney.co.uk>
+/*Expected Output:-
+A: 0 A
+B: 11 A
+
+Actual Output:-
+A: 0 A
+B: 2147483647 B
+*/
+
+#include <iostream>
+#include <iomanip>
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/bellman_ford_shortest_paths.hpp>
+#include <boost/cstdlib.hpp>
+#include <boost/test/minimal.hpp>
+
+int test_main(int, char*[])
+{
+ using namespace boost;
+
+ enum { A, B, Z };
+ char const name[] = "ABZ";
+ int const numVertex = static_cast<int>(Z) + 1;
+ typedef std::pair<int,int> Edge;
+ Edge edge_array[] = {Edge(B,A)};
+ int const numEdges = sizeof(edge_array) / sizeof(Edge);
+ int const weight[numEdges] = {11};
+
+ typedef adjacency_list<vecS,vecS,undirectedS,
+ no_property,property<edge_weight_t,int> > Graph;
+
+ Graph g(edge_array, edge_array + numEdges, numVertex);
+
+ Graph::edge_iterator ei, ei_end;
+ property_map<Graph,edge_weight_t>::type
+ weight_pmap = get(edge_weight, g);
+
+ int i = 0;
+ for(boost::tie(ei, ei_end) = edges(g); ei != ei_end; ++ei, ++i)
+ weight_pmap[*ei] = weight[i];
+
+ std::vector<int> parent(numVertex);
+ for(i = 0; i < numVertex; ++i)
+ parent[i] = i;
+
+ int inf = (std::numeric_limits<int>::max)();
+ std::vector<int> distance(numVertex, inf);
+ distance[A] = 0; // Set source distance to zero
+
+ bool const r = bellman_ford_shortest_paths
+ (g, int (numVertex),
+ weight_pmap,
+ boost::make_iterator_property_map(parent.begin(), get(boost::vertex_index, g)),
+ boost::make_iterator_property_map(distance.begin(), get(boost::vertex_index, g)),
+ closed_plus<int>(),
+ std::less<int>(),
+ default_bellman_visitor());
+
+ if (r) {
+ for(int i = 0; i < numVertex; ++i) {
+ std::cout << name[i] << ": ";
+ if (distance[i] == inf)
+ std::cout << std::setw(3) << "inf";
+ else
+ std::cout << std::setw(3) << distance[i];
+ std::cout << " " << name[parent[i]] << std::endl;
+ }
+ } else {
+ std::cout << "negative cycle" << std::endl;
+ }
+
+#if !(defined(__INTEL_COMPILER) && __INTEL_COMPILER <= 700) && !(defined(BOOST_MSVC) && BOOST_MSVC <= 1300)
+ graph_traits<Graph>::vertex_descriptor s = vertex(A, g);
+ std::vector<int> parent2(numVertex);
+ std::vector<int> distance2(numVertex, 17);
+ bool const r2 = bellman_ford_shortest_paths
+ (g,
+ weight_map(weight_pmap).
+ distance_map(boost::make_iterator_property_map(distance2.begin(), get(boost::vertex_index, g))).
+ predecessor_map(boost::make_iterator_property_map(parent2.begin(), get(boost::vertex_index, g))).
+ root_vertex(s));
+ if (r2) {
+ for(int i = 0; i < numVertex; ++i) {
+ std::cout << name[i] << ": ";
+ if (distance2[i] == inf)
+ std::cout << std::setw(3) << "inf";
+ else
+ std::cout << std::setw(3) << distance2[i];
+ std::cout << " " << name[parent2[i]] << std::endl;
+ }
+ } else {
+ std::cout << "negative cycle" << std::endl;
+ }
+
+ BOOST_CHECK(r == r2);
+ if (r && r2) {
+ BOOST_CHECK(parent == parent2);
+ BOOST_CHECK(distance == distance2);
+ }
+#endif
+
+ return boost::exit_success;
+}