Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
algorithms.doc
Скачиваний:
30
Добавлен:
06.12.2018
Размер:
9.73 Mб
Скачать
      1. Представление графа в памяти эвм

        1. Пусть имеется граф G=(V,E), имеющий N вершин и M ребер. Вершинам и ребрам можно сопоставить их номера от 1 до N и от 1 до M, соответственно. Рассмотрим различные варианты хранения данных об этом графе. Отметим, что для работы с графом требуются следующие операции

  • перечисление всех ребер, инцидентных вершине i

  • перечисление вершин, инцидентных ребру j

  • перечисление всех вершин, смежных с вершиной i

  • проверка смежности двух вершин

  • проверка смежности двух ребер

        1. Массив ребер

Для хранения информации о графе можно использовать массив ребер, в каждом элементе которого хранятся номера вершин, инцидентных ребру

#typedef MMax 100

int edges[MMax][2], n_edges;

здесь предполагается, что в графе содержится не более MMax ребер;

Имеем следующие времена выполнения интересующих нас операций

  • перечисление всех ребер, инцидентных вершине i T=O(M)

  • перечисление вершин, инцидентных ребру j T=O(1)

  • перечисление всех вершин, смежных с вершиной i T=O(M)

  • проверка смежности двух вершин T=O(M)

  • проверка смежности двух ребер T=O(1)

        1. Матрица смежности

Для хранения информации о графе можно использовать матрицу смежности из N строк и N столбцов, в (i,j) – элементе которой хранится количество ребер, инцидентных паре вершин с номерами i и j.

Имеем следующие времена выполнения интересующих нас операций

  • перечисление всех ребер, инцидентных вершине i -------

  • перечисление вершин, инцидентных ребру j -------

  • перечисление всех вершин, смежных с вершиной i T=O(N)

  • проверка смежности двух вершин T=O(1)

  • проверка смежности двух ребер -------

        1. Матрица инцидентности

Для хранения информации о графе можно использовать матрицу инцидентности из N строк и М столбцов, в (i,j) – элементе которой хранится 1, если вершина i инцидентна ребру j, и 0 – если нет.

Имеем следующие времена выполнения интересующих нас операций

  • перечисление всех ребер, инцидентных вершине i T=O(M)

  • перечисление вершин, инцидентных ребру j T=O(N)

  • перечисление всех вершин, смежных с вершиной i T=O(N M)

  • проверка смежности двух вершин T=O(N M)

  • проверка смежности двух ребер T=O(N+M)

        1. Списки смежных вершин

Для хранения информации о графе можно для каждой вершины хранить множество смежных вершин. Множество можно реализовать либо в виде массива:

#typedef NMax 100

typedef struct CVertex1_

{

int AdjacentVertices[NMax];

int NAdjacentVertices;

} CVertex1;

CVertex1 vertices[NMax];

здесь предполагается, что в графе содержится не более NMax вершин;

либо в виде списка:

#typedef NMax 100

typedef struct CAdjVertex_

{

int i; //номер текущей вершины

int i_next; //номер следующей вершины

} CAdjVertex;

typedef struct CVertex2_

{

CAdjVertex *AdjacentVerticesList_Head; //голова списка смежных вершин int i; //номер текущей вершины

} CVertex2;

CVertex2 vertices[NMax];

Т.о. в каждой вершине графа будет храниться вектор или список смежных вершин к данной вершине.

Имеем следующие времена выполнения интересующих нас операций

  • перечисление всех ребер, инцидентных вершине i -------

  • перечисление вершин, инцидентных ребру j -------

  • перечисление всех вершин, смежных с вершиной i T=O(N)

  • проверка смежности двух вершин T=O(N)

  • проверка смежности двух ребер -------

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]