Топологическая сортировка, пути в графе Лекция 13.

Презентация:



Advertisements
Похожие презентации
Теория графов Основные определения. Дуга Пусть имеется множество вершин V={V 1,V 2,…,V n } и пусть на нем задано бинарное отношение Г V×V, – V i Г V j.
Advertisements

Задача о максимальном потоке в сети Алгоритм Фалкерсона-Форда.
Теория графов Основные определения. Дуга Пусть имеется множество вершин V={V 1,V 2,…,V n } и пусть на нем задано бинарное отношение Г V×V, – V i Г V j.
Теория графов Основные определения. Задание графов Графический способ – Привести пример графического задания графа, состоящего из вершин А, В и С, связанных.
Алгоритмы на графах. Задача о максимальном потоке в сетях Требуется от источника к стоку передать максимальное количество энергии. В условиях задачи о.
ПОТОКИ В СЕТЯХ. Определения Сеть - связный ориентированный граф G = (V, A) без петель и мультидуг, с 1 источником s V и 1 стоком t V. (Запретим одновременное.
Введение в теорию сетевого планированияВведение в теорию сетевого планирования.
Алгоритмы сканирования и обхода Лекция 3. Алгоритм сканирования графа Input: Орграф (граф) G и вершина s. Output: Множество R вершин, достижимых из s,
Остовные деревья Лекция 4. Задача «Минимальное остовное дерево» Дано: Граф G, веса c: E(G) R. Найти остовное дерево в G наименьшего веса или определить,
M-чередующаяся декомпозиция Лекция 10. Нечетная декомпозиция Теорема 9.7 (Lovász [1972] ) Граф является фактор-критическим тогда и только тогда, когда.
Графы Лекция 2. Графы Неориентированным графом (графом) называется тройка (V, E, ), где V и E конечные множества и {X V : | X | = 2}. Ориентированным.
Теория графов Алгоритмы на графах. Медиана графа Медиана вершина графа, у которой сумма кратчайших расстояний от неё до вершин графа минимальная возможная.
Введение в теорию графов. ЗАДАЧА ПРОКЛАДКИ КОММУНИКАЦИЙ
АЛГОРИТМЫ НАХОЖДЕНИЯ КРАТЧАЙШИХ ПУТЕЙ НА ГРАФАХ..
Кратчайшие пути Лекция 5. Задача «Кратчайший путь» Дано: Орграф G, веса c: E(G) R и две вершины s, t V(G). Найти s-t-путь минимального веса.
Потоки в сетях Теорема о максимальном потоке и минимальном разрезе Лекция 6.
Динамическое программирование (Dynamic Programming)
Представление графов. Матрица смежности Граф:
ХНУРЭ, кафедра ПО ЭВМ, Тел , Лекции Н.В. Белоус Факультет компьютерных наук Кафедра ПО ЭВМ, ХНУРЭ Компьютерная.
Транспортные сети ХНУРЭ, кафедра ПО ЭВМ, Тел , Лекция 15 Н.В. Белоус Факультет компьютерных наук Кафедра ПО ЭВМ,
Транксрипт:

Топологическая сортировка, пути в графе Лекция 13

Топологическая сортировка Определение. Частичным порядком на множестве А называется отношение R, определенное на А и такое, что R транзитивно, для всех a A утверждение aRa ложно, т.е. отношение R иррефлексивно. Из свойств (1) и (2) следует, что если aRb истинно, то bRa ложно (асимметричность).

Примеры частичного порядка: решение большой задачи разбивается на ряд подзадач, над которыми установлен частичный порядок: без решения одной задачи нельзя решить несколько других; последовательность чтения курсов в учебных программах: один курс основывается на другом; выполнение работ: одну работу следует выполнить раньше другой.

Если R частичный порядок на множестве А, то (А, R) ациклический граф. Если (А, R ) ациклический граф и R отношение являться потомком, определенное на А, то R частичный порядок на А

Определение. Линейный порядок R на множестве А это такой частичный порядок, что если a и b принадлежат А, то либо aRb, либо bRa, либо a = b. Если А конечное множество, то линейный порядок R удобно представлять, считая все элементы множества А расположенными в виде последовательности a 1, a 2,..., a n, для которой имеет место a i Ra j тогда и только тогда, когда i < j.

Если задан частичный порядок R на множестве А, часто бывает нужен линейный порядок, содержащий этот частичный порядок. Эта проблема вложения частичного порядка в линейный называется топологической сортировкой. Формально можно сказать, что частичный порядок R на множестве А вложен в линейный порядок R', если R линейный порядок и R R', т. е. aRb влечет aR'b для всех а и b из А.

Топологическая сортировка. Пример

Алгоритм. Топологическая сортировка Вход. Частичный порядок R на конечном множестве А. Выход. Линейный порядок R' на А, для которого R R'. Метод. Так как А конечное множество, линейный порядок R' на А можно представить в виде списка O n = a 1, a 2,..., а n, для которого a i R' a j, если i < j, и А = {а 1, a 2,..., а n }. Эта последовательность элементов строится с помощью следующих шагов: (1)Положить i=1, А I =А и R i =R. (2)Если A i пусто, остановиться и выдать О i = a 1,..., а i, в качестве искомого линейного порядка. В противном случае выбрать в А i такой элемент а i+1 что a' R а i+1, ложно для всех a' A i. (3)Положить A i+1 = A i \ {а i+1 } и R i+1 = R i \ ({a i+1 } A i+1 ). Затем увеличить i на единицу и повторить шаг 2.

Топологическая сортировка. Пример

Топологическая сортировка. Реализация на матрице смежности Найти вершину, в которую не входит ни одна дуга (это нулевой столбец). Удалить все выходящие из нее дуги (обнулить соответствующую строку) 2. Пока не перебрали все вершины, повторять шаг 1.

Топологическая сортировка. Реализация на иерархических списках 1< 2; 3< 1; 4

Кратчайшие пути Пусть G = (V, E) – ориентированный граф. Поставим в оответствие каждому ребру e E в графе G неотрицательную стоимость w (e). w: E R + - функция стоимости Стоимость (вес) пути p(v 0, v 1, …, v k ) определяется как сумма стоимостей ребер, входящих в этот путь: w(p) = i w ( v i-1, v i ). Вес кратчайшего пути из u в v равен по определению min { w(p): u p v }, если существует путь из u в v δ(u,v)=, иначе Кратчайший путь из u в v это любой путь из u, для которого w(p)= δ(u,v)

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

Пусть G = (V, E) – заданный граф. Для каждой вершины v V мы будем помнить ее предшественника. Релаксация – постепенное уточнение верхней оценки на вес кратчайшего пути в заданную вершину. Свойства оптимальности. Лемма 1. Отрезки кратчайших путей являются кратчайшими: Если p(v 1, v 2, …, v k ) – кратчайший путь из v 1 в v k и 1 i j k, то p ij = (v i, v i+1, …, v j ) есть кратчайший путь из v i в v j Следствие 1. Рассмотрим кратчайший путь p из s в v. Пусть (u,v) – последнее ребро этого пути. Тогда δ(s,v) = δ(s,u) + w(u,v). Следствие 2. Для любого ребра (u,v) E справедливо δ(s,v) δ(s,u) + w(u,v).

Идея алгоритма нахождения кратчайших путей из одной вершины во все другие: Строится множество S, содержащее вершины графа, кратчайшие расстояния до которых от источника известны. На каждом шаге добавляется тот из оставшихся узлов, кратчайшее расстояние до которого меньше всех других оставшихся узлов.

Кратчайшие пути из вершины 10: VДлинаПуть через , , 8 или 3, , 8 10

Техника релаксации Для каждого ребра (u,v) храним d[v] – верхнюю оценку кратчайшего пути из s в v. Initialize (G,s){ for (для v V) { d[v] Π[v] NULL; } d[s] 0; }

Релаксация ребра (u,v): значение d[v] уменьшается до d[v+w(u,v)] (если второе второе значение меньше первого) Relax (u, v, w) { If (d[v] > d[u] +w(u,v)){ d[v] = d[ u] +w(u,v); Π[v] u; } }

Релаксация ребра при поиске кратчайших путей Пусть уже найдены оценки кратчайших путей для вершин, соединенных красным ребром. 9 6 d[8] = 6; d[7] = 9 Релаксация ребра (u, v): if (d[u] + w(u,v) < d[v]) d[v] = d[u] + w(u,v); Релаксация ребра (7, 8): > 6 Релаксация ребра (8, 7): < 9 d[7] = 8 8

В ходе работы алгоритма поддерживается множество S, состоящее из вершин, для которых δ(s,v) уже найдено ( т.е. d[s,v]= δ(s,v)). 1.Выбираем вершину u V \ S c наименьшим d[u]; 2.Добавляем вершину u к множеству S; 3.Выполняем релаксацию для всех инцидентных ребер; 4.Пока в S не добавили все вершины, повторять шаги 1-3.

Алгоритм Дейкстры Dijkstra(G,w,s){ Initialize(G,s); S ø ; Q V; // очередь с приоритетами While (Q ø ){ u Exstract_min(Q); // выбрать ближайшую S S U {u}; for (для v Adj[u]) Relax ( u, v, w); } }

Пример. Каждой вершине из V сопоставили метку минимальное известное расстояние от этой вершины до 1. На каждом шаге посещаем одну вершину и пытаемся уменьшать расстояние. Первый по очереди сосед вершины 1 вершина 2, потому что длина пути до неё минимальна. Длинапути в неё через вершину 1 равна кратчайшему расстоянию до вершины 1 + длина ребра, идущего из 1 в 2, то есть = 7.

Аналогичную операцию проделываем с двумя другими соседями 1-й вершины 3-й и 6-й.

Все соседи вершины 1 проверены. Текущее минимальное расстояние до вершины 1 считается окончательным и пересмотру не подлежит. Вычеркнем её, чтобы отметить, что эта вершина посещена. Снова находим «ближайшую» из непосещенных вершин. Это вершина 2.

Снова пытаемся уменьшить расстояния у смежных вершин, пытаясь пройти в них через 2-ю. Смежные вершины к 2 являются 1, 3, 4. Вершина 1 уже посещалась, поэтому с 1-й вершиной ничего не делаем. Вершина 3: если идти в неё через 2, то длина такого пути будет = 17. Но текущее расстояние у нее 9

Все смежные вершины с вершиной 2 просмотрены, замораживаем расстояние до неё и помечаем её как посещенную. Повторяем шаг алгоритма, выбрав вершину 3. После её обработки получим

Повторяем шаг алгоритма для оставшихся вершин 6, 4 и 5.

Пример. Очередь с приоритетами. Приоритет – текущая величина найденного расстояния от начальной вершины. Релаксации подвергаются прямые и обратные ребра Очередь n π d

Реализация с дополнительным массивом - O(n 2 ) Массив D[v] содержит стоимость текущего кратчайшего пути из s в v.

Dijkstra { S {s}; D[s] 0; для всех v V \ {v 0 } выполнить: D[v] = w (s, v); пока S V выполнять: { выбрать узел u V \ S, для которого D[u] принимает наименьшее значение; добавить w к S; для всех v V \ S выполнить D[v] = min (D[v], D[u] + w(u, v)); } }

Пример SuD[u]D[1]D[2]D[3]D[4] 0 {0} {0, 1} {0, 1, 2} {0, 1, 2, 3} {0, 1, 2, 3, 4}

Сложность алгоритма Дейкстры зависит от способа нахождения вершины v, а также способа хранения множества непосещенных вершин и способа обновления расстояний. 1.В простейшем случае, когда для поиска вершины с минимальным d[v] просматривается все множество вершин, а для хранения величин d массив, время работы алгоритма есть O(n 2 + m). Основной цикл выполняется порядка n раз, в каждом из них на нахождение минимума тратится порядка n операций, плюс количество релаксаций, которое не превосходит количества ребер в исходном графе. 2.Для разреженных графов непосещенные вершины можно хранить в двоичной куче, а в качестве ключа использовать значения d[i], тогда время извлечения вершины из U станет log n, при том, что время модификации d[i] возрастет до log n. Так как цикл выполняется порядка n раз, а количество релаксаций не больше m, скорость работы такой реализации O(nlogn + mlogn).

3.Если для хранения непосещенных вершин использовать фибоначчиеву кучу, для которой удаление происходит в среднем за O(log n), а уменьшение значения в среднем за O(1), то время работы алгоритма составит O(n log n + m).

Алгоритм Беллмана Форда За время O(|V| × |E|) алгоритм находит кратчайшие пути от одной вершины графа до всех остальных, допускает рёбра с отрицательным весом. Предложен независимо Ричардом Беллманом (Bellman) и Лестером Фордом (Ford). Алгоритм маршрутизации RIP был впервые разработан в 1969 году, как основной для сети ARPANET. В 1969 году Агентство передовых исследовательских проектов (ARPA) предложило разработать компьютерную сеть.

Компьютерная сеть была названа ARPANET, все работы финансировались за счёт Министерства обороны США. Затем сеть ARPANET начала активно расти и развиваться, её начали использовать учёные из разных областей науки. В 1973 году к сети были подключены первые иностранные организации из Великобритании и Норвегии, сеть стала международной. Стоимость пересылки электронного письма по сети ARPANET составляла 50 центов. В 1984 году у сети ARPANET появился серьёзный соперник, Национальный фонд науки США (NSF) основал обширную Межуниверситетскую сеть NSFNet, которая имела гораздо бо́льшую пропускную способность (56 кбит/с), нежели ARPANET. В 1990 году сеть ARPANET прекратила своё существование, полностью проиграв конкуренцию NSFNet.

Идея алгоритма. Алгоритм позволяет очень просто определить, существует ли в графе G отрицательный цикл, достижимый из вершины s. Для проверки нужно произвести внешнюю итерацию цикла |V| раз. Если при исполнении последней итерации длина кратчайшего пути до какой-либо вершины строго уменьшилась, то в графе есть отрицательный цикл, достижимый из s. На основе этого можно предложить следующую оптимизацию. Можно отслеживать изменения в графе и, как только они закончатся, дальнейшие итерации будут бессмысленны.

Bellman-Ford(G,w,s) { Initialize(G,s); for(i=1; id[u]+w(u,v) return 0; return 1; }

Кратчайшие пути в ориентированном графе 1.Если в ориентированном графе нет дуг с отрицательным весом, то алгоритм Дейкстры работает точно так же, как и в случае неориентированных графов. 2.Если в ориентированном графе нет циклов с отрицательным весом, то можно применить алгоритм Беллмана – Форда n π d И так далее… В конце концов получится… 3 12

Нахождение кратчайших путей между всеми парами вершин Строим матрицу стоимостей: w(i, j), если ребро (i, j) E M[i, j] =+, если ребро (i, j) E 0, если i = j Обозначим через d [i, j] матрицу кратчайших путей между всеми вершинами. Вершины занумеруем числами от 1 до n.

Алгоритм Флойда-Уоршолла Обозначим через d ij (k) стоимость кратчайшего пути из вершины с номером i в вершину с номером j с промежуточными вершинами из множества {1, 2, …, k}. M[i, j], если k = 0, d ij (k) = min(d ij (k-1), d ik (k-1) + d kj (k-1) ), если k 1 D (n) содержит искомое решение

Floyd-Warshall(M, n) { D (0) M; for k 1 to n do for i 1 to n do for j 1 to n do d ij (k) min(d ij (k-1), d ik (k-1) + d kj (k-1) ); return D (n) ; }

Транзитивное замыкание графа Пусть G= (V, E) ориентированный граф. Транзитивным замыканием графа G называется граф G= (V, E), в котором из вершины v в вершину w идет ребро существует путь (длины 0 или больше) из v в w в графе G. E:E: (a, b) E & (b, c) E (a, b) E & (b, c) E & (a, c) E

Построение транзитивного замыкания графа. Пример

Обозначим через t ij (k) наличие пути из вершины с номером i в вершину с номером j с промежуточными вершинами из множества {1, 2, …, k}. M – матрица смежностей графа G. M[i, j], если k = 0, t ij (k) = t ij (k-1) (t ik (k-1) t kj (k-1) ), если k 1 T (n) содержит искомое решение.

Алгоритм построения транзитивного замыкания графа Tranzitive_Clusure(M, n) { T (0) M; for k 1 to n do for i 1 to n do for j 1 to n do t ij (k) t ij (k-1) (t ik (k-1) t kj (k-1) ); return T (n) ; }

n π d Кратчайшие пути в ориентированном графе 3.Если в ориентированном графе нет циклов, то можно провести топологическую сортировку вершин, после чего выполнить релаксацию исходящих дуг в порядке возрастания номеров вершин Один из вариантов применения алгоритма: нахождение критического пути.

Алгоритм «умножения матриц» Пусть матрица G ( l ) представляет собой граф путей длиной l (то есть в матрице единица находится в ячейке (u,v), если в исходном графе существовал путь из u в v длиной не больше l ). Тогда матрица G (1) – это матрица смежности исходного графа G, G (n) – матрица смежности его транзитивного замыкания (очевидно, что если в графе существует путь длины, большей n, то существует и путь, длины не большей n). Алгоритм нахождения транзитивного замыкания: если удается вычислить G ( l+1 ) по G ( l ), то можно, начав с матрицы G, за n шагов получить матрицу G (n).