68
правок
Изменения
Нет описания правки
{{Задача|definition = Пусть дан [[Основные_определения_теории_графов |ациклический ориентированный взвешенный граф]]. Требуется найти вес кратчайшего пути из '''<tex>u''' </tex> в '''<tex>v''' </tex>. }}{{Определение|definition= '''Кратчайший путь''' из вершины '''u''' в вершину '''v''' – это такой путь из вершины '''u '''в вершину '''v''', что его суммарный вес входящих в него ребер минимален.}}
==Решение==
Пусть <tex>d</tex> — функция, где <tex>d(i)</tex> — вес кратчайшего пути из <tex>u</tex> в <tex>i</tex>. Ясно, что <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>
<font color=green>//p {{---}} массив индексов вершин графа в порядке топологической сортировки</font>
'''for''' i = 1 .. n
d[i] = '''infinity'''<tex>\infty</tex>
d[u] = 0 <font color=green>// где u {{---}} начальная вершина</font><br />
p = topSort(w) <font color=green>//топологическая сортировка графа</font>
==Пример==
[[Файл:WayAcyclicGraph.png|thumb|right|500px|Граф из примера]]
Пусть дана матрица смежности графа '''<tex>w''' </tex> со следующими весами ребер: <br />
{| class="wikitable" cellpadding="4" border="1" style="border-collapse: collapse;"
|-
| '''8''' || - || - || - || 1 || - || - || - || -
|}
Требуется найти путь вес кратчайшего пути из '''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 || 1 || 5 || 3 || 2 || 4 || 4
|}
Ответ равен <tex>5</tex>.
==Альтернативный способ решения==
*[[Алгоритм_Флойда_—_Уоршалла |Алгоритм Флойда—Уоршалла]]
*[[Алгоритм_Дейкстры |Алгоритм Дейкстры]]