Как написано eerorika , пример кода не очень хороший, и вам следует избегать использования таких сырых массивов. Массив в C / C ++ имеет размер c, каждый вектор в этом массиве является динамическим c, но не весь массив!
Существует два подхода к такому вопросу. Либо используйте списки смежности (что более распространено):
#include <vector>
#include <stdint.h>
class Vertix
{
public:
Vertix(uint64_t id_) : id(id_) {}
uint64_t get_id() const { return id; }
void add_adj_vertix(uint64_t id) { adj_vertices.push_back(id); }
const std::vector<uint64_t>& get_adj_vertices() const { return adj_vertices; }
private:
uint64_t id;
std::vector<uint64_t> adj_vertices;
};
class Graph
{
public:
void add_vertix(uint64_t id)
{
vertices[id] = Vertix(id);
}
void add_edge(uint64_t v_id, uint64_t u_id)
{
edges.emplace_back(u_id, v_id);
vertices[u_id].add_adj_vertix(v_id);
}
private:
std::vector<Vertix> vertices;
std::vector<std::pair<uint64_t, uint64_t>> edges;
};
или используйте двойной вектор для представления матрицы ребер:
std::vector<std::vector<uint64_t>> edges;
Но это не настоящая матрица, и вы не может проверить, есть ли (u, v)
в графе в O (1), который пропускает точку наличия матрицы смежности. Предполагая, что вы знаете размер Graph во время компиляции, вы должны написать что-то вроде:
#include <array>
#include <stdint.h>
template <size_t V>
using AdjacencyMatrix = std::array<std::array<bool, V>, V>;
template <size_t V>
void add_edge(AdjacencyMatrix<V>& adj_matrix, uint64_t u, uint64_t v)
{
if (u < V && v < V)
{
adj_matrix[u][v] = true;
}
else
{
// error handling
}
}
Тогда вы можете использовать AdjacencyMatrix<5>
вместо того, что они использовали в этом примере, во время O (1), и хотя он имеет размер stati c, он работает как задумано.