#include <boost/graph/graph_traits.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/dijkstra_shortest_paths.hpp>
using namespace boost;
using namespace std;
class GPS
{
public:
typedef boost::property<boost::edge_weight_t, float> Distance;
typedef adjacency_list<vecS, vecS, directedS, boost::no_property, Distance> Graph;
typedef int Node;
typedef std::pair<int, int> Edge;
typedef property_map<Graph, edge_weight_t>::type weightmap_t;
typedef graph_traits < Graph >::vertex_descriptor vertex_descriptor;
typedef graph_traits < Graph >::edge_descriptor edge_descriptor;
private:
vector<Edge> Edges;
Graph Nodes;
public:
GPS()
{
}
~GPS()
{
}
//returns amount of edges added: 0, 1 or 2
char AddEdge(Node from, Node to, Distance weight = 0.0f, bool BothDirections = false)
{
char added = 0;
if(add_edge(from,to,weight,Nodes).second)
++added;
if(BothDirections)
{
if(add_edge(to,from,weight,Nodes).second)
++added;
}
return added;
}
//returns the added node,
//specify your own vertex identificator if wanted
//(for maintaining backwards compatibility with old graphs saved in gps.dat files)
Node AddNode(int id = -1)
{
if(id == -1)
return add_vertex(Nodes);
else
return vertex(id,Nodes);
}
//get the shortest path between 'from' and 'to' by adding all nodes which are traversed into &path
void Path(Node from, Node to, vector<Node> &path)
{
std::vector<vertex_descriptor> p(num_vertices(Nodes));
std::vector<int> d(num_vertices(Nodes));
weightmap_t weightmap = get(edge_weight, Nodes);
vertex_descriptor s = vertex(from, Nodes);
dijkstra_shortest_paths(Nodes, s, predecessor_map(&p[0]).distance_map(&d[0]));
//what here, how to retrieve path between 'from' and 'to'?
}
};
I2luY2x1ZGUgPGJvb3N0L2dyYXBoL2dyYXBoX3RyYWl0cy5ocHA+CiNpbmNsdWRlIDxib29zdC9ncmFwaC9hZGphY2VuY3lfbGlzdC5ocHA+CiNpbmNsdWRlIDxib29zdC9ncmFwaC9kaWprc3RyYV9zaG9ydGVzdF9wYXRocy5ocHA+Cgp1c2luZyBuYW1lc3BhY2UgYm9vc3Q7CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBHUFMKewpwdWJsaWM6CiAgICB0eXBlZGVmCQkJYm9vc3Q6OnByb3BlcnR5PGJvb3N0OjplZGdlX3dlaWdodF90LCBmbG9hdD4JCQkJCQlEaXN0YW5jZTsKCXR5cGVkZWYJCQlhZGphY2VuY3lfbGlzdDx2ZWNTLCB2ZWNTLCBkaXJlY3RlZFMsIGJvb3N0Ojpub19wcm9wZXJ0eSwgRGlzdGFuY2U+CUdyYXBoOwoJdHlwZWRlZgkJCWludAkJCQkJCQkJCQkJCQkJCQkJTm9kZTsKCXR5cGVkZWYJCQlzdGQ6OnBhaXI8aW50LCBpbnQ+CQkJCQkJCQkJCQkJCUVkZ2U7Cgl0eXBlZGVmCQkJcHJvcGVydHlfbWFwPEdyYXBoLCBlZGdlX3dlaWdodF90Pjo6dHlwZQkJCQkJCQl3ZWlnaHRtYXBfdDsJCQkJCgl0eXBlZGVmCQkJZ3JhcGhfdHJhaXRzIDwgR3JhcGggPjo6dmVydGV4X2Rlc2NyaXB0b3IJCQkJCQkJdmVydGV4X2Rlc2NyaXB0b3I7Cgl0eXBlZGVmCQkJZ3JhcGhfdHJhaXRzIDwgR3JhcGggPjo6ZWRnZV9kZXNjcmlwdG9yCQkJCQkJCQllZGdlX2Rlc2NyaXB0b3I7CnByaXZhdGU6Cgl2ZWN0b3I8RWRnZT4JRWRnZXM7CglHcmFwaAkJCU5vZGVzOwpwdWJsaWM6CglHUFMoKSAKCXsKCgl9Cgl+R1BTKCkKCXsKCgl9CgkvL3JldHVybnMgYW1vdW50IG9mIGVkZ2VzIGFkZGVkOiAwLCAxIG9yIDIKCWNoYXIgQWRkRWRnZShOb2RlIGZyb20sIE5vZGUgdG8sIERpc3RhbmNlIHdlaWdodCA9IDAuMGYsIGJvb2wgQm90aERpcmVjdGlvbnMgPSBmYWxzZSkKCXsKCQljaGFyIGFkZGVkID0gMDsKCQlpZihhZGRfZWRnZShmcm9tLHRvLHdlaWdodCxOb2Rlcykuc2Vjb25kKQoJCQkrK2FkZGVkOwoJCWlmKEJvdGhEaXJlY3Rpb25zKQoJCXsKCQkJaWYoYWRkX2VkZ2UodG8sZnJvbSx3ZWlnaHQsTm9kZXMpLnNlY29uZCkKCQkJCSsrYWRkZWQ7CgkJfQoJCXJldHVybiBhZGRlZDsKCX0KCS8vcmV0dXJucyB0aGUgYWRkZWQgbm9kZSwgCgkvL3NwZWNpZnkgeW91ciBvd24gdmVydGV4IGlkZW50aWZpY2F0b3IgaWYgd2FudGVkIAoJLy8oZm9yIG1haW50YWluaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGdyYXBocyBzYXZlZCBpbiBncHMuZGF0IGZpbGVzKQoJTm9kZSBBZGROb2RlKGludCBpZCA9IC0xKQoJewoJCWlmKGlkID09IC0xKQoJCQlyZXR1cm4gYWRkX3ZlcnRleChOb2Rlcyk7CgkJZWxzZQoJCQlyZXR1cm4gdmVydGV4KGlkLE5vZGVzKTsKCX0KCS8vZ2V0IHRoZSBzaG9ydGVzdCBwYXRoIGJldHdlZW4gJ2Zyb20nIGFuZCAndG8nIGJ5IGFkZGluZyBhbGwgbm9kZXMgd2hpY2ggYXJlIHRyYXZlcnNlZCBpbnRvICZwYXRoCgl2b2lkIFBhdGgoTm9kZSBmcm9tLCBOb2RlIHRvLCB2ZWN0b3I8Tm9kZT4gJnBhdGgpCgl7CgkJc3RkOjp2ZWN0b3I8dmVydGV4X2Rlc2NyaXB0b3I+IHAobnVtX3ZlcnRpY2VzKE5vZGVzKSk7CgkJc3RkOjp2ZWN0b3I8aW50PiBkKG51bV92ZXJ0aWNlcyhOb2RlcykpOwoJCXdlaWdodG1hcF90IHdlaWdodG1hcCA9IGdldChlZGdlX3dlaWdodCwgTm9kZXMpOwoJCXZlcnRleF9kZXNjcmlwdG9yIHMgPSB2ZXJ0ZXgoZnJvbSwgTm9kZXMpOwoJCWRpamtzdHJhX3Nob3J0ZXN0X3BhdGhzKE5vZGVzLCBzLCBwcmVkZWNlc3Nvcl9tYXAoJnBbMF0pLmRpc3RhbmNlX21hcCgmZFswXSkpOwoKCQkvL3doYXQgaGVyZSwgaG93IHRvIHJldHJpZXZlIHBhdGggYmV0d2VlbiAnZnJvbScgYW5kICd0byc/Cgl9Cn07