blob: 4677096712ee02e20f000021154713e9320314e8 [file] [log] [blame]
//=======================================================================
// Copyright (c) 2013 Alberto Santini
// Author: Alberto Santini <alberto@santini.in>
//
// 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)
//=======================================================================
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/r_c_shortest_paths.hpp>
#include <boost/graph/iteration_macros.hpp>
#include <vector>
#include <memory>
using std::vector;
using std::allocator;
using namespace boost;
class VertexProperty {
public:
int property1;
int property2;
int id;
VertexProperty() {}
VertexProperty(const int property1, const int property2) : property1(property1), property2(property2) {}
};
class EdgeProperty {
public:
int cost;
int id;
EdgeProperty() {}
EdgeProperty(const int cost) : cost(cost) {}
};
typedef adjacency_list<listS, listS, bidirectionalS, VertexProperty, EdgeProperty> Graph;
typedef graph_traits<Graph>::vertex_descriptor Vertex;
typedef graph_traits<Graph>::edge_descriptor Edge;
class ResourceCont {
public:
int res;
ResourceCont(const int res = 5) : res(res) {}
bool operator==(const ResourceCont& rc) const { return (res == rc.res); }
bool operator<(const ResourceCont& rc) const { return (res > rc.res); }
};
class LabelExt {
public:
bool operator()(const Graph& g, ResourceCont& rc, const ResourceCont& old_rc, Edge e) const {
rc.res = old_rc.res - g[e].cost;
return (rc.res > 0);
}
};
class LabelDom {
public:
bool operator()(const ResourceCont& rc1, const ResourceCont& rc2) const {
return (rc1 == rc2 || rc1 < rc2);
}
};
int main() {
VertexProperty vp1(1, 1);
VertexProperty vp2(5, 9);
VertexProperty vp3(4, 3);
EdgeProperty e12(1);
EdgeProperty e23(2);
Graph g;
Vertex v1 = add_vertex(g); g[v1] = vp1;
Vertex v2 = add_vertex(g); g[v2] = vp2;
Vertex v3 = add_vertex(g); g[v3] = vp3;
add_edge(v1, v2, e12, g);
add_edge(v2, v3, e23, g);
int index = 0;
BGL_FORALL_VERTICES(v, g, Graph) {
g[v].id = index++;
}
index = 0;
BGL_FORALL_EDGES(e, g, Graph) {
g[e].id = index++;
}
typedef vector<vector<Edge> > OptPath;
typedef vector<ResourceCont> ParetoOpt;
OptPath op;
ParetoOpt ol;
r_c_shortest_paths( g,
get(&VertexProperty::id, g),
get(&EdgeProperty::id, g),
v1,
v2,
op,
ol,
ResourceCont(5),
LabelExt(),
LabelDom(),
allocator<r_c_shortest_paths_label<Graph, ResourceCont> >(),
default_r_c_shortest_paths_visitor());
return 0;
}