Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика - шпоры.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
136 Кб
Скачать

33. Внутреннее представление графа.

При анализе задачи обычно используют картинки, в которых вершины обозначены точками, а ребра – соединяющими линиями. этот способ для хранения графа в памяти компьютера не годится.

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

n*n, n – мощность множества вершин.

Каждая строка и столбец соответствует некоторой вершине. если есть ребро, связывающее вершины i j , то элемент матрицы смежности Sij=1. Если ребра нет, то Sij=о.

Для простого графа матрица смежности симметричная (относительно главной диагонали): Sij= Sji.

Для орграфа допускается существование петел, т.е. дуг, выходящих и входящих в одну и ту же вершину.

Матрица смежности удобна при решении графовых задач, т.к. позволяет быстро определить соседние по отношению к рассматриваемой вершине.

Однако матрица смежности обладает тем недостатком, что нерационально используется память компьютера: она содержит слишком много нулей. А для простого графа информация о наличии ребер еще и дублируется.

2. Другим способом хранения графов в памяти ПК является список ребер, в котором перечисляются все ребра, входящие в граф. При этом каждое ребро определяется его концевыми вершинами.

Это наиболее экономичный способ хранения графов в массиве, элементами которого являются пары вершин.

этот способ имеет следующие недостатки: 1) никак не учитываются изолированные вершины, 2) трудно выполнить добавление или удаление элементов из графа, как того требуют некоторые алгоритмы.

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

В этом случае для каждой вершины составляется цепной список, в котором перечисляются все соседние вершины в произвольном порядке.

Т.к. цепной список целиком определяется указателем на первое звено списка, то эти главные указатели помещаются в массив такой длины, каково количество вершин в графе.

Достоинства: 1) списки размещаются в динамической памяти, 2) списки легко модифицируются в случае включения новых ребер или удаления старых.

недостаток: каждое ребро отображается в двух списках соседних вершин.

34. Алгоритм обхода вершин графа "в глубину".

При решении многих графовых задач возникает необходимость систематического перебора вершин графа. Это означает, что ни одна вершина не должна быть пропущена и не должна рассматриваться (посещаться) дважды.

Такая необходимость возникает, например, при поиске пути между двумя заданными вершинами (кратчайшего или любого первопопавшего) или при выборе наилучшей в каком-то смысле вершины из всех вершин графа.

В глубину. девиз: «Двигайся вперед, пока это возможно и отступай минимально назад, если пути вперед уже нет».

Идея этого алгоритма состоит в следующем:

1. Начало. Обход начинается с некоторой заданной вершины v0. Она рассматривается, а затем процесс повторяется от любой соседней с v0 вершиной.

2. Общий шаг. Пусть рассматривается некоторая вершина v. после рассмотрения она объявляется не новой и если существует соседняя новая вершина, то процесс продолжается для этой соседней вершины. если же новых соседних вершин не осталось, то вершина v объявляется использованной, делается переход на ту вершину, из которой был сделан переход в вершину v и продолжается просмотр соседей этой предыдущей вершины с целью перехода на другую новую соседнюю вершину.

3. окончание. Обход заканчивается, если

1) найдена искомая вершина

2) исходная вершина v0 стала использованной. Это значит что все вершины графа рассмотрены.

Отметим два свойства этого алгоритма:

1) поиск в глубину из вершины v приводит к поиску в глубину из соседней с v новой вершины – налицо рекурсивные свойства этого алгоритма.

2) для поиска в глубину характерно то, что чем позже будет рассмотрена некоторая вершина (перестанет быть новой), тем раньше эта вершина окажется использованной.

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

Рассмотрим обход вершин конкретного графа. при этом будем решать одновременно 2 задачи: 1. Обход всех вершин графа. 2. Поиск пути из исходной вершины в заданную конечную.

Procedure В_глубину (v: V);

Begin

обработка(v); НОВАЯ[v]:=false;

For u СМЕЖНЫЕ[v] Do

If НОВАЯ[u] Then В_глубину(u);

End:

Основная программа, которая использует эту процедуру:

Begin

{инициализация}

For v V Do НОВАЯ[v]:= True;

For v V Do

If НОВАЯ[v] Then В_глубину(v);

End.

1. В программе используется логический массив НОВАЯ[v V], который содержит признак новизны для каждой вершины графа

НОВАЯ[v]:= True, если v – не рассмотрена, false, если рассмотрена.

2. В основной программе второй цикл по перебору вершин графа нуңен потому что однократный запуск проөедуры В_глубину позволяет просмотреть все вершины в пределах компоненты связности графа, которые содержат вершину v.

Если в графе несколько компонент связности, то после первого запуска процедуры В_глубину во множестве вершин V еще останутся новые вершины. Поэтому очередная новая вершина будет найдена в цикле по перебору всех вершин графа.