diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -7,6 +7,7 @@ counter_test dfs_test digraph_test + dijkstra_test dim_test error_test graph_test diff --git a/test/Makefile.am b/test/Makefile.am --- a/test/Makefile.am +++ b/test/Makefile.am @@ -13,6 +13,7 @@ test/counter_test \ test/dfs_test \ test/digraph_test \ + test/dijkstra_test \ test/dim_test \ test/error_test \ test/graph_test \ @@ -33,6 +34,7 @@ test_counter_test_SOURCES = test/counter_test.cc test_dfs_test_SOURCES = test/dfs_test.cc test_digraph_test_SOURCES = test/digraph_test.cc +test_dijkstra_test_SOURCES = test/dijkstra_test.cc test_dim_test_SOURCES = test/dim_test.cc test_error_test_SOURCES = test/error_test.cc test_graph_test_SOURCES = test/graph_test.cc diff --git a/test/dijkstra_test.cc b/test/dijkstra_test.cc new file mode 100644 --- /dev/null +++ b/test/dijkstra_test.cc @@ -0,0 +1,140 @@ +/* -*- C++ -*- + * + * This file is a part of LEMON, a generic C++ optimization library + * + * Copyright (C) 2003-2008 + * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport + * (Egervary Research Group on Combinatorial Optimization, EGRES). + * + * Permission to use, modify and distribute this software is granted + * provided that this copyright notice appears in all copies. For + * precise terms see the accompanying LICENSE file. + * + * This software is provided "AS IS" with no warranty of any kind, + * express or implied, and with no claim as to its suitability for any + * purpose. + * + */ + +///\file +///\brief Test cases for Dijkstra algorithm. + +#include +#include +#include +#include +#include +#include + +#include "test_tools.h" + +using namespace lemon; + +void checkDijkstraCompile() +{ + typedef int VType; + typedef concepts::Digraph Digraph; + typedef concepts::ReadMap LengthMap; + typedef Dijkstra DType; + + Digraph G; + Digraph::Node n; + Digraph::Arc e; + VType l; + bool b; + DType::DistMap d(G); + DType::PredMap p(G); + // DType::PredNodeMap pn(G); + LengthMap length; + + DType dijkstra_test(G,length); + + dijkstra_test.run(n); + + l = dijkstra_test.dist(n); + e = dijkstra_test.predArc(n); + n = dijkstra_test.predNode(n); + d = dijkstra_test.distMap(); + p = dijkstra_test.predMap(); + // pn = dijkstra_test.predNodeMap(); + b = dijkstra_test.reached(n); + + Path pp = dijkstra_test.path(n); +} + +void checkDijkstraFunctionCompile() +{ + typedef int VType; + typedef concepts::Digraph Digraph; + typedef Digraph::Arc Arc; + typedef Digraph::Node Node; + typedef concepts::ReadMap LengthMap; + + Digraph g; + dijkstra(g,LengthMap(),Node()).run(); + dijkstra(g,LengthMap()).source(Node()).run(); + dijkstra(g,LengthMap()) + .predMap(concepts::WriteMap()) + .distMap(concepts::WriteMap()) + .run(Node()); +} + +template +void checkDijkstra() { + TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); + typedef typename Digraph::template ArcMap LengthMap; + + Digraph G; + Node s, t; + LengthMap length(G); + PetStruct ps = addPetersen(G, 5); + + for(int i=0;i<5;i++) { + length[ps.outcir[i]]=4; + length[ps.incir[i]]=1; + length[ps.chords[i]]=10; + } + s=ps.outer[0]; + t=ps.inner[1]; + + Dijkstra + dijkstra_test(G, length); + dijkstra_test.run(s); + + check(dijkstra_test.dist(t)==13,"Dijkstra found a wrong path."); + + Path p = dijkstra_test.path(t); + check(p.length()==4,"getPath() found a wrong path."); + check(checkPath(G, p),"path() found a wrong path."); + check(pathSource(G, p) == s,"path() found a wrong path."); + check(pathTarget(G, p) == t,"path() found a wrong path."); + + for(ArcIt e(G); e!=INVALID; ++e) { + Node u=G.source(e); + Node v=G.target(e); + check( !dijkstra_test.reached(u) || (dijkstra_test.dist(v) - dijkstra_test.dist(u) <= length[e]), + "dist(target)-dist(source)-arc_length= " << dijkstra_test.dist(v) - dijkstra_test.dist(u) - length[e]); + } + + for(NodeIt v(G); v!=INVALID; ++v){ + check(dijkstra_test.reached(v),"Each node should be reached."); + if ( dijkstra_test.predArc(v)!=INVALID ) { + Arc e=dijkstra_test.predArc(v); + Node u=G.source(e); + check(u==dijkstra_test.predNode(v),"Wrong tree."); + check(dijkstra_test.dist(v) - dijkstra_test.dist(u) == length[e], + "Wrong distance! Difference: " << std::abs(dijkstra_test.dist(v) - dijkstra_test.dist(u) - length[e])); + } + } + + { + NullMap myPredMap; + dijkstra(G,length).predMap(myPredMap).run(s); + } +} + +int main() { + checkDijkstra(); + checkDijkstra(); + return 0; +}