Простой пример. Предположим, у вас есть тип вершины Vertex
.Ваш граф состоит из набора вершин, который вы можете реализовать следующим образом:
std::unordered_set<Vertex> vertices;
Теперь для каждой пары вершин, между которыми есть грань в вашем графе, вам нужно записать это ребро.В представлении списка смежности вы создадите тип ребра, который может быть парой вершин, а ваш список смежности может быть просто списком (или снова набором) таких ребер:
typedef std::pair<Vertex, Vertex> Edge;
std::list<Edge> edges_as_list;
std::unordered_set<Edge> edges_as_set;
(ВыВозможно, вы захотите снабдить последний набор ненаправленным компаратором, для которого (a,b) == (b,a)
, если у вас есть ненаправленный граф .)
С другой стороны, если вы хотите сделать матрица смежности представление, вы бы вместо этого создали массив bools и указали бы, какие вершины имеют ребра между ними:
bool edges_as_matrix[vertices.size()][vertices.size()]; // `vector` is better
// edges_as_matrix[i][j] = true if there's an edge
(Для этого вам потребуется способ перечисления вершин. В ненаправленномВ графе матрица смежности симметрична; в ориентированном графе этого не должно быть.)
Представление списка лучше, если имеется несколько ребер, а представление матрицы лучше, если имеется много ребер.