Изменения

Перейти к: навигация, поиск

Кратчайший путь в ациклическом графе

1530 байт добавлено, 23:52, 10 мая 2016
Пример
{{Задача|definition = Пусть дан [[Основные_определения_теории_графов |ациклический ориентированный взвешенный граф]]. Требуется найти вес [[Алгоритм_Дейкстры |кратчайшего пути ]] из '''<tex>u''' </tex> в '''<tex>v''' </tex>. {{Определение|definition= '''Кратчайший путь''' из '''u''' в '''v''' – это такой путь из '''u '''в '''v''', что его сумарный вес входящих в него ребер минимален}} 
==Решение==
Воспользуемся принципом оптимальности на префиксе.<br />Пусть <tex>d </tex> массивфункция, где <tex>d[(i] )</tex> — вес кратчайшего пути из <tex>u </tex> в <tex>i</tex>. Изначально значения d равны бесконечностиЯсно, кроме что <tex>d[(u], который )</tex> равен <tex>0</tex>. Пусть <tex>w[(i][, j] )</tex> {{--- }} вес ребра из <tex>i </tex> в <tex>j</tex>. Будем обходить граф в порядке [[Использование_обхода_в_глубину_для_топологической_сортировки | топологической сортировки]]. Получаем следующие соотношения: <br />: <tex> d[(i] ) = \min\limits_{\mathop{j:j \rightsquigarrow i}} (d[(j] ) + w[(j][, i])) </tex>
Так как мы обходим граф в порядке [[Использование_обхода_в_глубину_для_топологической_сортировки |топологической сортировки]], то на <tex>i</tex>-ом шаге во всех всем <tex>d[(j] )</tex> (<tex>j </tex> такие, что: существует ребро из <tex>j </tex> в <tex>i</tex>) уже записаны присвоены оптимальные ответы, и , следовательно в , <tex>d[(i] )</tex> также будет записан присвоен оптимальный ответ.
==Реализация==
Реализуем данный алгоритм:
<font color=green>//w {{-- матрицы как в описании, -}} матрица смежности</font> <font color=green>//d {{- --}} массив как в описании, кратчайших расстояний</font> <font color=green>//p {{- --}} массив индексов вершин графа в порядке топологической сортировки, i, j - счетчики <br /> inputData() //считывание данных <br /font> '''for ''' i = 1 to .. n d[i] = infinity <tex>\infty</tex> d[u] = 0 <font color=green>// где u {{---}} начальная вершина</font><br /> p = topSort(w) <font color=green>//топологическая сортировка графа <br /> d[p[u]] = 0 <br /font> '''for ''' i = 1 to .. n '''for ''' j: есть ребро из p[i] в j
d[j] = min(d[j], d[p[i]] + w[p[i]][j]) <br />
writeData(); // запись данных
==Пример==
[[Файл:Index1WayAcyclicGraph.jpgpng|thumb|right|180px500px|граф Граф из примера]]Пусть дан граф дана матрица смежности графа <tex>w</tex> со следующими весами '''w''' ребер: <br />
{| class="wikitable" cellpadding="4" border="1" style="border-collapse: collapse;"
|-
| || '''1''' || '''2''' || '''3''' || '''4''' || '''5''' || '''6''' || '''7''' || '''8'''
|-
| '''1''' || 0 - || - || - || 5 - || - 2 || - || - || -
|-
| '''2''' || 1 || 0 - || 1 || - || 4 || 3 || - || -
|-
| '''3''' || - || - || 0 - || - || - || 1 || - || -
|-
| '''4''' || - || - || - || 0 - || - || - || - || -
|-
| '''5''' || - || - || - || 3 || 0 - || - || - || 1
|-
| '''6''' || - || - || - || 5 || - || 0 - || 2 || -
|-
| '''7''' || - || - || - || 2 || - || - || 0 - || -
|-
| '''8''' || - || - || - || 1 || - || - || - || 0 -
|}
Требуется найти путь вес кратчайшего пути из '''2''' в '''4'''. <br />Массив <tex>p </tex> будет выглядеть следующим образом: <br />
{| class="wikitable" cellpadding="4" border="1" style="border-collapse: collapse;"
|-
| <tex>i</tex> || '''1''' || '''2''' || '''3''' || '''4''' || '''5''' || '''6''' || '''7''' || '''8'''
|-
| <tex>p[i]</tex> || 2 || 3 || 6 || 7 || 1 || 5 || 8 || 4
|}
Массив <tex>d </tex> будет выглядеть следующим образом: <br />
{| class="wikitable" cellpadding="4" border="1" style="border-collapse: collapse;"
|-
| <tex>i</tex> || '''1''' || '''2''' || '''3''' || '''4''' || '''5''' || '''6''' || '''7''' || '''8'''
|-
| <tex>d[i]</tex> || 1 || 0 || 3 1 || 5 || 3 || 2 || 4 || 4
|}
Ответ равен 2<tex>5</tex>==Альтернативный способ решения==Решим задачу, используя [[Обход_в_ширину |обход в ширину]]. Для этого заведем массив, в котором будем хранить веса кратчайших расстояний от начальной вершины до всех остальных. Совершая обход по графу, будем в каждой вершине для всех ее потомков проверять, уменьшится ли вес кратчайшего пути до сына, если пройти через текущую вершину. Если да, то весу кратчайшего расстояния до сына присваиваем значение, равное сумме веса кратчайшего расстояния до текущей вершины и стоимости прохода по ребру между вершиной и ее сыном.В силу особенности обхода графа, обновление весов кратчайших путей до сыновей вершины происходит только тогда, когда для нее уже найден оптимальный ответ. ==См. также==*[[Алгоритм_Флойда_—_Уоршалла |Алгоритм Флойда—Уоршалла]]*[[Алгоритм_Форда-Беллмана |Алгоритм Форда-Беллмана]]
==Источникиинформации==
*[http://www.ics.uci.edu/~eppstein/161/960208.html Алгоритмы поиска кратчайшего пути в графе]
*[http://neerc.ifmo.ru/mediawiki/index.php/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B5%D1%84%D0%B8%D0%BA%D1%81%D0%B5 Принцип оптимальности на префиксе]* [http://en.wikipedia.org/wiki/Optimal_substructure Принцип оптимальности на подзадаче (в качестве примера разбирается задача поиска кратчайшего пути в ациклическом графе)(англ.)Wikipedia {{---}} Optimal substructure][[Категория: Динамическое программированиеДискретная математика и алгоритмы]] [[Категория: Дискретная математика и алгоритмыДинамическое программирование]]
Анонимный участник

Навигация