00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef MSL_GRAPH_H
00021 #define MSL_GRAPH_H
00022
00023
00024
00025
00026 #include "vector.h"
00027 #include "mslio.h"
00028
00029 class MSLEdge;
00030
00031 class MSLVertex {
00032 private:
00033 MSLVector state;
00034 double cost;
00035 list<MSLEdge*> edges;
00036 int id;
00037 bool mark;
00038
00039 public:
00041 MSLVector State() const {return state; };
00042
00044 inline list<MSLEdge*> Edges() const {return edges; };
00045
00047 inline double Cost() const {return cost; };
00048
00050 inline void SetCost(const double &x) {cost = x; };
00051
00053 inline void SetID(const int &i) {id = i; };
00054
00056 inline int ID() const {return id; };
00057
00059 inline void Mark() {mark = true; };
00060
00062 inline void Unmark() {mark = false; };
00063
00065 inline bool IsMarked() const {return mark; };
00066
00067 MSLVertex();
00068 MSLVertex(const MSLVector &x);
00069 ~MSLVertex();
00070
00071
00072 friend istream& operator>> (istream& is, MSLVertex& n) { return is; };
00073 friend ostream& operator<< (ostream& os, const MSLVertex& n);
00074
00075
00076
00077 friend class MSLEdge;
00078 friend class MSLGraph;
00079 };
00080
00081
00082
00083
00084
00085 class MSLEdge {
00086 private:
00087 MSLVector input;
00088 MSLVertex* source;
00089 MSLVertex* target;
00090 double time;
00091 double cost;
00092 public:
00093 MSLEdge();
00094 MSLEdge(MSLVertex* v1, MSLVertex* v2,
00095 const MSLVector &u, double t);
00096 MSLEdge(MSLVertex* v1, MSLVertex* v2, double t);
00097 MSLEdge(MSLVertex* v1, MSLVertex* v2);
00098 ~MSLEdge() {};
00099
00101 inline double Time() const {return time; };
00102
00104 inline double Cost() const {return cost; };
00105
00107 inline void SetCost(const double &x) {cost = x; };
00108
00110 inline MSLVector Input() const {return input; };
00111
00113 inline MSLVertex* Source() const {return source; };
00114
00116 inline MSLVertex* Target() const {return target; };
00117
00118
00119 friend istream& operator>> (istream& is, MSLEdge& e) { return is; };
00120 friend ostream& operator<< (ostream& os, const MSLEdge& e);
00121 };
00122
00123 ostream& operator<< (ostream& os, const MSLEdge& e);
00124
00125
00127 class MSLVertexLess {
00128 public:
00129 bool operator() (MSLVertex* p, MSLVertex* q) const {
00130 return p->Cost() < q->Cost();
00131 }
00132 };
00133
00134
00136 class MSLVertexGreater {
00137 public:
00138 bool operator() (MSLVertex* p, MSLVertex* q) const {
00139 return p->Cost() > q->Cost();
00140 }
00141 };
00142
00143
00144 class MSLGraph {
00145 private:
00146 list<MSLVertex*> vertices;
00147 list<MSLEdge*> edges;
00148 int numvertices;
00149 int numedges;
00150 public:
00151
00152 MSLGraph();
00153 virtual ~MSLGraph();
00154
00155 MSLVertex* AddVertex(const MSLVector &x);
00156 MSLEdge* AddEdge(MSLVertex* v1, MSLVertex* v2);
00157 MSLEdge* AddEdge(MSLVertex* v1, MSLVertex* v2, double time);
00158 MSLEdge* AddEdge(MSLVertex* v1, MSLVertex* v2,
00159 const MSLVector &u, double time);
00160 bool IsEdge(MSLVertex* v1, MSLVertex* v2);
00161 MSLVertex* FindVertex(int nid);
00162 inline list<MSLVertex*> Vertices() const { return vertices; };
00163 inline list<MSLEdge*> Edges() const { return edges; };
00164 inline int Size() {return numvertices+numedges;}
00165 inline int NumVertices() const {return numvertices;}
00166 inline int NumEdges() const {return numedges;}
00167
00168 void Clear();
00169
00170
00171 friend istream& operator>> (istream& is, MSLGraph& n);
00172 friend ostream& operator<< (ostream& os, const MSLGraph& n);
00173 };
00174
00175 istream& operator>> (istream& is, MSLGraph& n);
00176 ostream& operator<< (ostream& os, const MSLGraph& n);
00177
00178 #endif