00001
00002
00003
00004 #ifndef CAJUN_GRAPH_H
00005 #define CAJUN_GRAPH_H
00006
00007 #include <map>
00008 #include <vector>
00009
00010 namespace cajun
00011 {
00012 template <typename ID_T>
00013 class graph_t
00014 {
00015 public:
00016 class edge_t;
00017 class vertex_t
00018 {
00019 public:
00020 ID_T const &id () const
00021 { return m_id; }
00022
00023 edge_t *add_edge (vertex_t *dst_, double cost_)
00024 {
00025 edge_t *edge = new edge_t (dst_, cost_);
00026 m_edges.push_back (edge);
00027 return edge;
00028 }
00029 unsigned num_edges () const { return m_edges.size (); }
00030 edge_t *edge (unsigned i) const { return m_edges[i]; }
00031
00032
00033 edge_t *add_back_edge (vertex_t *dst_, double cost_)
00034 {
00035 edge_t *edge = new edge_t (dst_, cost_);
00036 m_back_edges.push_back (edge);
00037 return edge;
00038 }
00039 unsigned num_back_edges () const { return m_back_edges.size (); }
00040 edge_t *back_edge (unsigned i) const { return m_back_edges[i]; }
00041
00042 bool operator == (vertex_t const &v_) const
00043 { return (m_id == v_.id ()); }
00044 void set_cost (unsigned edge_id_, double cost_)
00045 { m_edges[edge_id_].set_cost (cost_); }
00046 private:
00047 friend class graph_t;
00048 vertex_t (ID_T id_): m_id (id_) {}
00049 ID_T m_id;
00050 std::vector<edge_t *> m_edges;
00051 std::vector<edge_t *> m_back_edges;
00052 };
00053
00054 class edge_t
00055 {
00056 public:
00057 double cost () { return m_cost; }
00058 void set_cost (double cost_) { m_cost = cost_;}
00059 edge_t (vertex_t *des_,double cost_):
00060 m_cost (cost_), m_dest (des_){}
00061 vertex_t* get_vertex () {return m_dest;}
00062 private:
00063 double m_cost;
00064 vertex_t *m_dest;
00065 };
00066
00067 void flush ()
00068 { m_vertex.clear (); }
00069
00070
00071 vertex_t* add_vertex (ID_T const &id_)
00072 {
00073
00074 vertex_t *new_vertex = new vertex_t (id_);
00075
00076 m_vertex.insert (make_pair (id_, new_vertex));
00077 if (m_vertex.find (id_) == m_vertex.end ())
00078 {
00079 printf ("Failed to insert the item \n");
00080 return NULL;
00081 }
00082 return new_vertex;
00083 }
00084
00085 bool find_vertex (ID_T const &id_,
00086 std::vector<vertex_t*> &vertex_list_)
00087 {
00088 typename std::multimap<ID_T, vertex_t *, ID_T>::iterator iter;
00089 for (iter = m_vertex.lower_bound (id_);
00090 iter != m_vertex.upper_bound (id_); iter++)
00091 {
00092 vertex_list_.push_back (iter->second);
00093 }
00094
00095 return true;
00096 }
00097
00098 void print_graph ()
00099 {
00100 typename std::multimap<ID_T, vertex_t *, ID_T>::iterator ver;
00101 for (ver = m_vertex.begin (); ver != m_vertex.end (); ver++)
00102 {
00103 printf ("Vertex: ");
00104 ver->first.print ();
00105
00106 for (unsigned i =0; i < ver->second->num_edges ();i++)
00107 {
00108 vertex_t *nv= (ver->second->edge (i))->get_vertex ();
00109 printf ("\tedge cost (%.2f): ",
00110 (ver->second->edge (i)->cost ()));
00111 nv->id ().print ();
00112 }
00113
00114 for (unsigned i =0; i < ver->second->num_back_edges ();i++)
00115 {
00116 vertex_t *nv= (ver->second->back_edge (i))->get_vertex ();
00117 printf ("\t\t back edge cost (%.2f): ",
00118 (ver->second->back_edge (i)->cost ()));
00119 nv->id ().print ();
00120 }
00121 }
00122 }
00123
00124 private:
00125 std::multimap<ID_T, vertex_t *> m_vertex;
00126 };
00127 };
00128
00129 #endif