Add GraphBase::getDegree()
This commit is contained in:
parent
1834109040
commit
f6b9e7b034
@ -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();
|
||||||
|
@ -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++;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user