Add GraphBase::getDegree()

This commit is contained in:
Stefan Müller 2025-06-23 20:52:16 +02:00
parent 1834109040
commit f6b9e7b034
2 changed files with 18 additions and 9 deletions

View File

@ -23,6 +23,7 @@ class GraphBase
public: public:
size_t getNVertices() const; size_t getNVertices() const;
size_t getNEdges() const; size_t getNEdges() const;
size_t getDegree(const int vertex) const;
bool areAdjacent(const int vertex1, const int vertex2) const; bool areAdjacent(const int vertex1, const int vertex2) const;
struct Incidence struct Incidence
@ -51,7 +52,7 @@ class GraphBase
{ {
if (vertex >= 0 && vertex < graph_->getNVertices()) if (vertex >= 0 && vertex < graph_->getNVertices())
{ {
setIncidence(graph_->firstVertexIncidences[vertex]); setIncidence(graph_->vertexIncidenceHeaders[vertex].first);
} }
}; };
NeighborIterator& operator++() NeighborIterator& operator++()
@ -99,7 +100,8 @@ class GraphBase
NeighborIterator end() const; NeighborIterator end() const;
protected: protected:
std::vector<int> firstVertexIncidences{}; // First is the index of the first incidence, second is the number of incidences (the length of the list).
std::vector<std::pair<int, size_t>> vertexIncidenceHeaders{};
std::vector<int> nextIncidences{}; std::vector<int> nextIncidences{};
std::vector<int> incidenceVertices{}; std::vector<int> incidenceVertices{};
int addVertexInternal(); int addVertexInternal();

View File

@ -17,7 +17,7 @@
size_t GraphBase::getNVertices() const size_t GraphBase::getNVertices() const
{ {
return firstVertexIncidences.size(); return vertexIncidenceHeaders.size();
} }
size_t GraphBase::getNEdges() const size_t GraphBase::getNEdges() const
@ -25,6 +25,11 @@ size_t GraphBase::getNEdges() const
return nextIncidences.size() >> 1; return nextIncidences.size() >> 1;
} }
size_t GraphBase::getDegree(const int vertex) const
{
return vertexIncidenceHeaders[vertex].second;
}
bool GraphBase::areAdjacent(const int vertex1, const int vertex2) const bool GraphBase::areAdjacent(const int vertex1, const int vertex2) const
{ {
auto it = begin(vertex1); auto it = begin(vertex1);
@ -51,17 +56,19 @@ GraphBase::NeighborIterator GraphBase::end() const
int GraphBase::addVertexInternal() int GraphBase::addVertexInternal()
{ {
firstVertexIncidences.push_back(-1); vertexIncidenceHeaders.push_back({ -1, 0 });
return static_cast<int>(firstVertexIncidences.size()) - 1; return static_cast<int>(vertexIncidenceHeaders.size()) - 1;
} }
void GraphBase::addEdgeInternal(const int vertex1, const int vertex2) void GraphBase::addEdgeInternal(const int vertex1, const int vertex2)
{ {
incidenceVertices.push_back(vertex2); incidenceVertices.push_back(vertex2);
nextIncidences.push_back(firstVertexIncidences[vertex1]); nextIncidences.push_back(vertexIncidenceHeaders[vertex1].first);
firstVertexIncidences[vertex1] = static_cast<int>(incidenceVertices.size()) - 1; vertexIncidenceHeaders[vertex1].first = static_cast<int>(incidenceVertices.size()) - 1;
vertexIncidenceHeaders[vertex1].second++;
incidenceVertices.push_back(vertex1); incidenceVertices.push_back(vertex1);
nextIncidences.push_back(firstVertexIncidences[vertex2]); nextIncidences.push_back(vertexIncidenceHeaders[vertex2].first);
firstVertexIncidences[vertex2] = static_cast<int>(incidenceVertices.size()) - 1; vertexIncidenceHeaders[vertex2].first = static_cast<int>(incidenceVertices.size()) - 1;
vertexIncidenceHeaders[vertex2].second++;
} }