00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include <Graph.h>
00037 #include <Vertex.h>
00038 #include <VertexIter.h>
00039 #include <iostream.h>
00040 #include <ArrayOfTaggedObjects.h>
00041
00042 Graph::Graph()
00043 :myVertices(0), theVertexIter(0), numEdge(0)
00044 {
00045 myVertices = new ArrayOfTaggedObjects(32);
00046 theVertexIter = new VertexIter(myVertices);
00047 }
00048
00049
00050 Graph::Graph(int numVertices)
00051 :myVertices(0), theVertexIter(0), numEdge(0)
00052 {
00053 myVertices = new ArrayOfTaggedObjects(numVertices);
00054 theVertexIter = new VertexIter(myVertices);
00055 }
00056
00057
00058 Graph::Graph(TaggedObjectStorage &theVerticesStorage)
00059 :myVertices(&theVerticesStorage), theVertexIter(0), numEdge(0)
00060 {
00061 theVerticesStorage.clearAll();
00062 theVertexIter = new VertexIter(myVertices);
00063 }
00064
00065
00066 Graph::~Graph()
00067 {
00068
00069 myVertices->clearAll();
00070
00071 if (myVertices != 0)
00072 delete myVertices;
00073
00074 if (theVertexIter != 0)
00075 delete theVertexIter;
00076 }
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 bool
00087 Graph::addVertex(Vertex *vertexPtr, bool checkAdjacency)
00088 {
00089
00090 if (vertexPtr == 0) {
00091 cerr << "WARNING ArrayGraph::addVertex";
00092 cerr << " - attempting to add a NULL vertex*\n";
00093 return false;
00094 }
00095
00096 if (checkAdjacency == true) {
00097 if (vertexPtr->getDegree() != 0) {
00098 const ID &adjacency = vertexPtr->getAdjacency();
00099 int size = adjacency.Size();
00100 for (int i=0; i<size; i++) {
00101 Vertex *other = this->getVertexPtr(adjacency(i));
00102 if (other == 0) {
00103 cerr << "WARNING ArrayGraph::addVertex";
00104 cerr << " - vertex with adjacent vertex not in graph\n";
00105 return false;
00106 }
00107 }
00108 }
00109 }
00110
00111 bool result = myVertices->addComponent(vertexPtr);
00112 if (result == false) {
00113 cerr << "WARNING ArrayGraph::addVertex";
00114 cerr << " - vertex could not be stored in TaggedObjectStorage object\n";
00115 }
00116 return result;
00117 }
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 int
00129 Graph::addEdge(int vertexTag, int otherVertexTag)
00130 {
00131
00132
00133 Vertex *vertex1 = this->getVertexPtr(vertexTag);
00134 Vertex *vertex2 = this->getVertexPtr(otherVertexTag);
00135 if ((vertex1 == 0) || (vertex2 == 0)) {
00136 cerr << "WARNING Graph::addEdge() - one or both of the vertices ";
00137 cerr << vertexTag << " " << otherVertexTag << " not in Graph\n";
00138 return -1;
00139 }
00140
00141
00142 int result;
00143 if ((result = vertex1->addEdge(otherVertexTag)) == 0) {
00144 if ((result = vertex2->addEdge(vertexTag)) == 0)
00145 numEdge++;
00146 else {
00147 cerr << "WARNING Graph::addEdge() - " << vertexTag;
00148 cerr << " has not been added to " << otherVertexTag;
00149 cerr << " adjacency - yet vica-versa ok.\n";
00150 return -2;
00151 }
00152 }
00153
00154 return result;
00155 }
00156
00157
00158 Vertex *
00159 Graph::getVertexPtr(int vertexTag)
00160 {
00161 TaggedObject *res = myVertices->getComponentPtr(vertexTag);
00162 if (res == 0) return 0;
00163 Vertex *result = (Vertex *)res;
00164 return result;
00165 }
00166
00167
00168 VertexIter &
00169 Graph::getVertices(void)
00170 {
00171
00172 theVertexIter->reset();
00173 return *theVertexIter;
00174 }
00175
00176
00177 int
00178 Graph::getNumVertex(void) const
00179 {
00180 return myVertices->getNumComponents();
00181 }
00182
00183 int
00184 Graph::getNumEdge(void) const
00185 {
00186 return numEdge;
00187 }
00188
00189 Vertex *
00190 Graph::removeVertex(int tag, bool flag)
00191 {
00192 TaggedObject *mc = myVertices->removeComponent(tag);
00193 if (mc == 0) return 0;
00194 Vertex *result = (Vertex *)mc;
00195
00196 if (flag == true) {
00197 cerr << "Graph::removeVertex(int tag, bool flag = true)";
00198 cerr << " - no code to remove edges yet\n";
00199 return 0;
00200 }
00201 return result;
00202 }
00203
00204
00205
00206
00207 void
00208 Graph::Print(ostream &s, int flag)
00209 {
00210 myVertices->Print(s, flag);
00211 }
00212
00213
00214 ostream &operator<<(ostream &s, Graph &M)
00215 {
00216 M.Print(s);
00217 return s;
00218 }
00219