При применении алгоритмов на графах большое значение имеет способ их представления.
Есть несколько способов представить граф в алгоритмах. Выбор структуры данных зависит от размера графа
и способа его обработки в алгоритме. Ниже рассмотрены три популярных представления.
Списки смежности. В этом случае каждой вершине x сопоставляется список смежности, включающий вершины, соединенные с x ребром.
Списки смежности – самый популярный способ представления графов, они позволяют эффективно реализовать большинство алгоритмов.
Списки смежности удобно хранить в "списке списков" , который может быть представлен следующим образом:
словарь или список graph (graph[x]= список/словарь, элементы которого есть описание ребер в смежные вершины :
- вершина - для невзвешенного графа
- (вершина, вес) - для взвешенного граф
Списки смежности позволяют эффективно находить вершины, в которые можно перейти из данной по одному ребру.
Следующий цикл обходит все вершины, в которые можно попасть из вершины s:
for u in graph[s] :
# обработать вершину u
Матрица смежности показывает, какие ребра есть в графе. С ее помощью можно эффективно проверить, существует ли ребро между двумя вершинами. Матрицу можно хранить в виде двумерного списка adj[N][N], где элемент adj[a][b] равен 1, если существует ребро, ведущее из верши ны a в вершину b, а в противном случае равен 0. сли граф взвешенный, то представление в виде матрицы смежности можно обобщить:
если две вершины соединены ребром, то в матрице хранится вес этого ребра.
Недостаток матрицы смежности заключается в том, что она содержит n2 элементов, большая часть которых обычно равна 0. Поэтому такое представление не годится для больших графов.
Список ребер содержит все ребра графа в некотором порядке. Это представление удобно, если алгоритм обрабатывает все ребра и не требуется находить ребра, начинающиеся в заданной вершине.Список ребер можно хранить в списке и перебирать следующим образом:
for ed in edges :
# обработка ребра ed
# ed - кортеж (a,b) или (a,b,w) a,b - вершины соединяемые ребром, w - вес ребра (для взвешенного)