лекции по курсу «алгоритмизация и программирование

advertisement
ЛЕКЦИЯ 14. ГРАФЫ И ИХ ПРЕДСТАВЛЕНИЕ. ОСНОВНЫЕ АЛГОРИТМЫ НА
ГРАФАХ.
Множество различных задач может быть естественным образом сформулировано в терминах
точек и связей между ними, т.е. в терминах графов (задачи составления расписания, транспортные задачи, задачи анализа сетей и т.д.). Эффективные алгоритмы решения задач теории
графов имеют поэтому большое практическое значение.
ОСНОВНЫЕ ОПРЕДЕЛЕНИЯ
ГРАФОМ называется тройка Г=(X, U, Ф), где X – множество вершин, U – множество рёбер
(дуг), Ф – отношение инцидентности. Отношение инцидентности является трёхместным отношением Ф(x, u, y), где x, yX, uU, которое может быть истинным либо ложным. При
этом ребро всегда соединяет пару вершин и соответствует не более чем одной паре вершин.
Граф называется ОРИЕНТИРОВАННЫМ, если каждое его ребро ориентировано (представляет собой направленный отрезок). Иногда удобно преобразовать неориентированный граф в
ориентированный заменой каждого неориентированного ребра парой ориентированных рёбер с противоположной ориентацией.
Пример неориентированного (слева) и ориентированного (справа) графа:
СПОСОБЫ ПРЕДСТАВЛЕНИЯ ГРАФОВ
Большинство задач на графах касается определения компонент связности, поиска
маршрутов, нахождения расстояний и т.п. При их численном решении на ЭВМ граф должен
быть представлен неким дискретным способом. Одно из направлений теории графов связано
с их представлением с помощью алгебраических форм – матриц. Такое представление графов удобно для решения многих практических задач. Ниже рассматриваются некоторые такие представления.
Матрица смежности графа
Матрицей смежности ориентированного графа с n вершинами называется матрица
A=[aij], i,j=1,…,n, в которой aij=1, если существует ребро (xi, xj) и aij=0, если вершины xi, xj не
связаны с ребром (xi, xj).
Матрица смежности однозначно определяет структуру графа. Ребро типа петли в матрице смежности представляется соответствующим единичным диагональным элементом.
Недостатком представления графа с помощью матрицы смежности является отсутствие возможности представления кратных рёбер.
2
u1
u3
u2
1
0
0

0
A
0
0

0
3
4
u4
u5
u6
5
u7
u8
6
1 1 0 0 0
0 1 0 0 0

0 0 1 1 0

0 0 0 1 1
0 0 0 0 0

0 0 0 1 0
На рисунке приведён пример ориентированного графа и его матрицы смежности.
Матрицу смежности удобно использовать и для представления т.н. ВЗВЕШЕННЫХ
графов. Граф называется взвешенным, если каждому его ребру сопоставлено число. Простой
взвешенный граф может быть представлен своей матрицей весов W=[wij] – вес соединяющего вершины i, j. Веса несуществующих рёбер полагают равными 0 или . Матрица весов, таким образом, будет являться простым обобщением матрицы смежности.
Матрица инцидентности графа
Матрицей инцидентности для неориентированного графа с n вершинами и m рёбрами
называется матрица B=[bij], i=1, 2, …, n, j=1, 2, …, m, строки которой соответствуют вершинам, а столбцы – рёбрам. Элементы bij=1, если вершина xi инцидентна uj, bij=0, если вершина
xi не инцидентна uj.
Матрицей инцидентности для ориентированного графа с n вершинами и m рёбрами
называется матрица B=[bij], i=1, 2, …, n, j=1, 2, …, m, строки которой соответствуют вершинам, а столбцы – рёбрам. Элементы bij=1, если ребро uj выходит из вершины xi, bij=-1, если
ребро uj не выходит из вершины xi, bij=0, если вершина xi не инцидентна uj.
Матрица инцидентности однозначно определяет структуру графа. На рисунке представлен пример матрицы инцидентности для ориентированного графа из предыдущего пункта.
1
0
0
0
0
0
0
1
 1 0
1
0
0
0
0
0


 0 1 1 1
1
0
0
0
A

0
0
0

1
0
1
1
0


0
0
0
0  1  1 0  1


0
0
0
0
0 1 1 
0
Структура смежности графа
Ориентированный или неориентированный граф может быть однозначно представлен
СТРУКТУРОЙ СМЕЖНОСТИ своих вершин. Структура смежности состоит из списков
Dots[x] вершин графа, смежных с вершиной x. Списки Dots[x] составляются для каждой
вершины графа. Для примера опишем структурой смежности граф, представленный выше на
рисунке.
xi
Dots[xi]
1
2, 3
2
-1, 3
3
-1, -2, 4, 5
4
-3, 5, 6
5
-3, -4, -6
6
-4, 5
Структуры смежности могут быть удобно реализованы массивом из n связных списков. Хранение структуры смежности на связных списках желательно в алгоритмах, в основе которых
лежат операции добавления и удаления вершин.
МЕТОД ПОИСКА В ГЛУБИНУ
Поиск в глубину является одним из наиболее естественных способов систематического исследования всех вершин графа. На неориентированном графе поиск в глубину осуществляют следующим образом:
1. Из вершины x идём по одному из рёбер (x, y) к смежной вершине y;
2. Если вершина y уже была пройдена (посещалась ранее), то возвращаемся в x и выбираем другое ребро.
3. Если вершина y не была пройдена, то заходим в неё и рекурсивно применяем процесс
прохождения уже к вершине y.
4. Если все рёбра, инцидентные вершине x уже просмотрены, то идём назад по ребру (s,
x), по которому пришли в x и продолжаем исследование рёбер, инцидентных вершине
s. Процесс заканчивается, когда попытаемся вернуться из вершины, из которой начали просмотр графа.
Поиск в глубину можно также осуществлять и на ориентированном графе. Если граф
ориентированный, то находясь в вершине x необходимо выбрать ребро (x, y), только выходящее из х. Исследовав все рёбра, выходящие из y, возвращаемся в x даже тогда, когда
в y входят другие рёбра, ещё не рассмотренные. Данная техника просмотра в глубину полезна при определении различных свойств ориентированных и неориентированных графов, например, для решения задачи о выделении компонент связности графа (вершины x,
y называются связанными, если существует путь из x в y). Сложность алгоритма поиска в
глубину составляет O(n+m) (n – число вершин, m – число рёбер).
ПОСТРОЕНИЕ МИНИМАЛЬНОГО ОСТОВНОГО ДЕРЕВА
ОСТОВНЫМ ДЕРЕВОМ связного неориентированного графа называется дерево, являющееся его подграфом и содержащее все его вершины (см. пример).
граф
остовное дерево
УТВЕРЖДЕНИЕ: дерево с n вершинами содержит n-1 ребро.
Практическую значимость остовных деревьев даёт популярная задача Кэли. Необходимо соединить n городов железнодорожными линиями так, чтобы не строить лишних
дорог. Известна стоимость строительства для каждой пары городов. Какова должна быть
сеть дорог, соединяющая все города и имеющая минимальную возможную стоимость?
Аналогичные вопросы возникают при проектировании линий электропередачи, сетей
ЭВМ и др.
В терминах теории графов эту задачу можно сформулировать так. Пусть есть взвешенный граф. Необходимо построить остовное дерево этого графа, имеющее минимальный вес (сумма весов его рёбер минимальна).
Рассмотрим один из наиболее популярных алгоритмов решения этой задачи.
Алгоритм ближайшего соседа построения минимального остовного дерева
1. Построение остовного дерева начинается с произвольной вершины x1.
2. Среди рёбер, инцидентных x1, выбираем ребро (x1, x2) с наименьшим весом и
включаем его в остовное дерево.
3. Повторяя процесс, выполняем поиск наименьшего по весу ребра, соединяющего
вершины x1 и x2 c некоторой другой вершиной графа x3.
4. Процесс включения рёбер продолжается до тех пор, пока все вершины графа не
будут включены в остовное дерево.
Сложность алгоритма ближайшего соседа составляет O(n2).
На рисунке приведён пример взвешенного графа и соответствующего ему минимального остовного дерева.
7
3
5
1
2
8
4
5
КРАТЧАЙШИЕ ПУТИ НА ГРАФЕ
Рассматриваемый алгоритм определяет расстояния между вершинами в ориентированном графе с неотрицательными весами wij (wij – вес ребра (xi xj). Если граф не является
ориентированным, то его можно сделать таковым, заменив каждое неориентированное
ребро парой ориентированных.
Пусть нужно найти кратчайший путь между выделенными вершинами x0 и z. Алгоритм поиска кратчайшего пути, начиная из вершины x0, просматривает граф в ширину и
помечает вершины xj значениями-метками их расстояний от x0. Метки могут быть временные и окончательные. Временная метка вершины xj – это минимальное расстояние от
x0 до xj, когда учтены ещё не все маршруты из x0 в xj. Окончательная метка вершины xj –
это минимальное расстояние на графе от x0 до xj. В каждый момент работы алгоритма
часть вершин будет иметь окончательные вершины, а часть – временные. Алгоритм заканчивается, когда вершина z получит окончательную метку.
Вначале вершине x0 присваивается окончательная метка 0 (нулевое расстояние
1.
до самой себя), а каждой из остальных вершин – временная метка .
Каждой вершине xj, если она не имеет окончательной метки и смежна xi (той,
2.
что в последний раз получила окончательную метку) присваивается новая временная метка – наменьшая из её временной и числа (wij+окончательная метка
xi).
Определяется наименьшая из всех временных меток, которая и становиться
3.
окончательной меткой своей вершины. Если имеются равные метки, выбирается
любая из них.
Пункты 2 и 3 циклически повторяются, пока вершина z не получит окончательной
метки.
Рассмотрим пример
х2
2
1
3
7
х1
х4
х3
4
8
2
х5
2
х6
Нужно найти кратчайший путь из х1 в х6.
Процесс назначения меток вершинам графа удобно представить таблицей. Жирным в
ней выделены окончательные метки вершин, то есть расстояния от них до х1. По ним
легко восстановить путь перемещения из х1 в х6.
Х1
Х2
Х3
Х4
Х5
Х6
0





2
7



5



6
7

15
11
Сложность рассмотренного алгоритма поиска кратчайшего пути является квадратичной.
ЗАДАНИЕ К ЛЕКЦИИ 14
Задать взвешенный граф с помощью матрицы смежности (матрицы весов). Отрисовать его на визуальном компоненте. Определить и отрисовать минимальное остовное дерево графа.
Пусть на плоскости заданы несколько точек и несколько отрезков, соединяющих эти
точки так, чтобы имел место связный граф. Написать функцию, определяющую кратчайший путь из одной точки до другой, если движение возможно только по имеющимся отрезкам.
Download