2 #ifndef ANDRES_GRAPH_HXX
3 #define ANDRES_GRAPH_HXX
14 #include "adjacency.hxx"
15 #include "subgraph.hxx"
16 #include "visitor.hxx"
17 #include "detail/graph.hxx"
26 template<
typename VISITOR = IdleGraphVisitor<std::
size_t> >
62 std::size_t
vertexOfEdge(
const std::size_t,
const std::size_t)
const;
63 std::size_t
edgeFromVertex(
const std::size_t,
const std::size_t)
const;
64 std::size_t
edgeToVertex(
const std::size_t,
const std::size_t)
const;
66 std::size_t
vertexToVertex(
const std::size_t,
const std::size_t)
const;
69 std::pair<bool, std::size_t>
findEdge(
const std::size_t,
const std::size_t)
const;
75 std::size_t
insertEdge(
const std::size_t,
const std::size_t);
81 typedef detail::Adjacencies Vertex;
82 typedef detail::Edge<false> Edge;
84 void insertAdjacenciesForEdge(
const std::size_t);
85 void eraseAdjacenciesForEdge(
const std::size_t);
87 std::vector<Vertex> vertices_;
88 std::vector<Edge> edges_;
89 bool multipleEdgesEnabled_;
97 template<
typename VISITOR>
104 multipleEdgesEnabled_(false),
113 template<
typename VISITOR>
116 const std::size_t numberOfVertices,
119 : vertices_(numberOfVertices),
121 multipleEdgesEnabled_(false),
124 visitor_.insertVertices(0, numberOfVertices);
131 template<
typename VISITOR>
138 multipleEdgesEnabled_ =
false;
147 template<
typename VISITOR>
150 const std::size_t numberOfVertices,
153 vertices_.resize(numberOfVertices);
154 std::fill(vertices_.begin(), vertices_.end(), Vertex());
156 multipleEdgesEnabled_ =
false;
158 visitor_.insertVertices(0, numberOfVertices);
163 template<
typename VISITOR>
166 return vertices_.size();
171 template<
typename VISITOR>
174 return edges_.size();
183 template<
typename VISITOR>
186 const std::size_t vertex
188 return vertices_[vertex].size();
197 template<
typename VISITOR>
200 const std::size_t vertex
202 return vertices_[vertex].size();
210 template<
typename VISITOR>
213 const std::size_t edge,
218 return edges_[edge][j];
228 template<
typename VISITOR>
231 const std::size_t vertex,
234 return vertices_[vertex][j].edge();
244 template<
typename VISITOR>
247 const std::size_t vertex,
250 return vertices_[vertex][j].edge();
260 template<
typename VISITOR>
263 const std::size_t vertex,
266 return vertices_[vertex][j].vertex();
276 template<
typename VISITOR>
279 const std::size_t vertex,
282 return vertices_[vertex][j].vertex();
291 template<
typename VISITOR>
294 vertices_.push_back(Vertex());
295 visitor_.insertVertex(vertices_.size() - 1);
296 return vertices_.size() - 1;
306 template<
typename VISITOR>
309 const std::size_t number
311 std::size_t position = vertices_.size();
312 vertices_.insert(vertices_.end(), number, Vertex());
313 visitor_.insertVertices(position, number);
323 template<
typename VISITOR>
326 const std::size_t vertexIndex0,
327 const std::size_t vertexIndex1
329 assert(vertexIndex0 < numberOfVertices());
330 assert(vertexIndex1 < numberOfVertices());
332 if(multipleEdgesEnabled()) {
334 edges_.push_back(Edge(vertexIndex0, vertexIndex1));
335 std::size_t edgeIndex = edges_.size() - 1;
336 insertAdjacenciesForEdge(edgeIndex);
337 visitor_.insertEdge(edgeIndex);
341 std::pair<bool, std::size_t> p = findEdge(vertexIndex0, vertexIndex1);
355 template<
typename VISITOR>
358 const std::size_t vertexIndex
360 assert(vertexIndex < numberOfVertices());
363 while(vertices_[vertexIndex].size() != 0) {
364 eraseEdge(vertices_[vertexIndex].begin()->edge());
367 if(vertexIndex == numberOfVertices()-1) {
368 vertices_.pop_back();
369 visitor_.eraseVertex(vertexIndex);
375 std::size_t movingVertexIndex = numberOfVertices() - 1;
376 std::set<std::size_t> affectedEdgeIndices;
377 for(Vertex::const_iterator it = vertices_[movingVertexIndex].begin();
378 it != vertices_[movingVertexIndex].end(); ++it) {
379 affectedEdgeIndices.insert(it->edge());
383 for(std::set<std::size_t>::const_iterator it = affectedEdgeIndices.begin();
384 it != affectedEdgeIndices.end(); ++it) {
386 eraseAdjacenciesForEdge(*it);
389 for(std::size_t j=0; j<2; ++j) {
390 if(edges_[*it][j] == movingVertexIndex) {
391 edges_[*it][j] = vertexIndex;
395 if(edges_[*it][0] > edges_[*it][1]) {
396 std::swap(edges_[*it][0], edges_[*it][1]);
401 vertices_[vertexIndex] = vertices_[movingVertexIndex];
402 vertices_.pop_back();
405 for(std::set<std::size_t>::const_iterator it = affectedEdgeIndices.begin();
406 it != affectedEdgeIndices.end(); ++it) {
407 insertAdjacenciesForEdge(*it);
410 visitor_.eraseVertex(vertexIndex);
411 visitor_.relabelVertex(movingVertexIndex, vertexIndex);
419 template<
typename VISITOR>
422 const std::size_t edgeIndex
424 assert(edgeIndex < numberOfEdges());
426 eraseAdjacenciesForEdge(edgeIndex);
427 if(edgeIndex == numberOfEdges() - 1) {
429 visitor_.eraseEdge(edgeIndex);
432 std::size_t movingEdgeIndex = numberOfEdges() - 1;
433 eraseAdjacenciesForEdge(movingEdgeIndex);
434 edges_[edgeIndex] = edges_[movingEdgeIndex];
436 insertAdjacenciesForEdge(edgeIndex);
437 visitor_.eraseEdge(edgeIndex);
438 visitor_.relabelEdge(movingEdgeIndex, edgeIndex);
449 template<
typename VISITOR>
452 const std::size_t vertex
454 return vertices_[vertex].begin();
464 template<
typename VISITOR>
467 const std::size_t vertex
469 return vertices_[vertex].end();
479 template<
typename VISITOR>
482 const std::size_t vertex
484 return vertices_[vertex].begin();
494 template<
typename VISITOR>
497 const std::size_t vertex
499 return vertices_[vertex].end();
509 template<
typename VISITOR>
512 const std::size_t vertex
514 return vertices_[vertex].begin();
524 template<
typename VISITOR>
527 const std::size_t vertex
529 return vertices_[vertex].end();
539 template<
typename VISITOR>
542 const std::size_t vertex
544 return vertices_[vertex].begin();
554 template<
typename VISITOR>
557 const std::size_t vertex
559 return vertices_[vertex].end();
569 template<
typename VISITOR>
572 const std::size_t vertex
574 return vertices_[vertex].begin();
584 template<
typename VISITOR>
587 const std::size_t vertex
589 return vertices_[vertex].end();
599 template<
typename VISITOR>
602 const std::size_t vertex
604 return vertices_[vertex].begin();
614 template<
typename VISITOR>
617 const std::size_t vertex
619 return vertices_[vertex].end();
626 template<
typename VISITOR>
629 const std::size_t number
631 vertices_.reserve(number);
638 template<
typename VISITOR>
641 const std::size_t number
643 edges_.reserve(number);
651 template<
typename VISITOR>
654 const std::size_t vertex,
657 return vertices_[vertex][j];
665 template<
typename VISITOR>
668 const std::size_t vertex,
671 return vertices_[vertex][j];
682 template<
typename VISITOR>
683 inline std::pair<bool, std::size_t>
685 const std::size_t vertex0,
686 const std::size_t vertex1
688 assert(vertex0 < numberOfVertices());
689 assert(vertex1 < numberOfVertices());
691 std::size_t v0 = vertex0;
692 std::size_t v1 = vertex1;
693 if(numberOfEdgesFromVertex(vertex1) < numberOfEdgesFromVertex(vertex0)) {
698 verticesFromVertexBegin(v0),
699 verticesFromVertexEnd(v0),
702 if(it != verticesFromVertexEnd(v0) && *it == v1) {
704 const std::size_t j = std::distance(verticesFromVertexBegin(v0), it);
705 return std::make_pair(
true, edgeFromVertex(v0, j));
708 return std::make_pair(
false, 0);
716 template<
typename VISITOR>
719 return multipleEdgesEnabled_;
728 template<
typename VISITOR>
731 return multipleEdgesEnabled_;
734 template<
typename VISITOR>
737 const std::size_t edgeIndex
739 const Edge& edge = edges_[edgeIndex];
740 const std::size_t vertexIndex0 = edge[0];
741 const std::size_t vertexIndex1 = edge[1];
742 vertices_[vertexIndex0].insert(
743 AdjacencyType(vertexIndex1, edgeIndex)
745 if(vertexIndex1 != vertexIndex0) {
746 vertices_[vertexIndex1].insert(
747 AdjacencyType(vertexIndex0, edgeIndex)
752 template<
typename VISITOR>
754 Graph<VISITOR>::eraseAdjacenciesForEdge(
755 const std::size_t edgeIndex
757 const Edge& edge = edges_[edgeIndex];
758 const std::size_t vertexIndex0 = edge[0];
759 const std::size_t vertexIndex1 = edge[1];
760 Vertex& vertex0 = vertices_[vertexIndex0];
761 Vertex& vertex1 = vertices_[vertexIndex1];
763 AdjacencyType adj(vertexIndex1, edgeIndex);
764 RandomAccessSet<AdjacencyType>::iterator it = vertex0.find(adj);
765 assert(it != vertex0.end());
768 if(vertexIndex1 != vertexIndex0) {
769 adj.vertex() = vertexIndex0;
770 it = vertex1.find(adj);
771 assert(it != vertex1.end());
779 #endif // #ifndef ANDRES_GRAPH_HXX