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

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 4: Строка 4:
 
==Решение==
 
==Решение==
 
Пусть d — матрица, где d[i] — вес кратчайшего пути из '''u''' в '''i'''. Изначально значения d равны бесконечности, кроме d[u], который равен 0. Пусть w[i][j] - вес ребра из '''i''' в '''j'''. Будем обходить граф в порядке топологической сортировки. Получаем следующие соотношения: <br />
 
Пусть d — матрица, где d[i] — вес кратчайшего пути из '''u''' в '''i'''. Изначально значения d равны бесконечности, кроме d[u], который равен 0. Пусть w[i][j] - вес ребра из '''i''' в '''j'''. Будем обходить граф в порядке топологической сортировки. Получаем следующие соотношения: <br />
* <tex> d[i] = \min\limits_{\mathop{j:j \rightsquigarrow i}} (d[j] + w[j][i]) </tex>
+
: <tex> d[i] = \min\limits_{\mathop{j:j \rightsquigarrow i}} (d[j] + w[j][i]) </tex>
  
 
Так как мы обходим граф в порядке топологической сортировки, то на i-ом шаге во всех d[j] (j такие, что: /exist ребро из j в i) уже записаны оптимальные ответы, и следовательно в d[i] так же будет записан оптимальный ответ.
 
Так как мы обходим граф в порядке топологической сортировки, то на i-ом шаге во всех d[j] (j такие, что: /exist ребро из j в i) уже записаны оптимальные ответы, и следовательно в d[i] так же будет записан оптимальный ответ.
Строка 10: Строка 10:
 
==Реализация==
 
==Реализация==
 
Реализуем данный алгоритм методом "динамика вперед":
 
Реализуем данный алгоритм методом "динамика вперед":
   //d, w - матрицы как в описании, p - матрица индексов вершин графа в порядке топологической сортировки, i, j - счетчики <br />
+
   //d, w - матрицы как в описании, p - массив индексов вершин графа в порядке топологической сортировки, i, j - счетчики <br />
 
   inputData() //считывание данных <br />
 
   inputData() //считывание данных <br />
 
   for i = 1 to n
 
   for i = 1 to n
 
     d[i] = infinity <br />
 
     d[i] = infinity <br />
   topSort() //топологическая сортировка <br />
+
   p = topSort() //топологическая сортировка <br />
 
   d[p[u]] = 0 <br />
 
   d[p[u]] = 0 <br />
 
   for i = 1 to n
 
   for i = 1 to n
Строка 54: Строка 54:
 
Ответ равен 2.
 
Ответ равен 2.
 
==Источники==
 
==Источники==
* [http://ru.wikipedia.org/wiki/Динамическое_программирование Википедия]
+
* [http://en.wikipedia.org/wiki/Optimal_substructure Принцип оптимальности на подзадаче (в качестве примера разбирается задача поиска кратчайшего пути в ациклическом графе)(англ.)]
 
[[Категория: Динамическое программирование ]]
 
[[Категория: Динамическое программирование ]]

Версия 02:26, 29 ноября 2011

Формулировка задачи

Пусть дан ациклический взвешенный граф. Требуется найти вес кратчайшего пути из u в v

Определение:
Кратчайший путь из u в v – это такой путь из u в v, что его вес меньше или равен веса любого другого пути из u в v

Решение

Пусть d — матрица, где d[i] — вес кратчайшего пути из u в i. Изначально значения d равны бесконечности, кроме d[u], который равен 0. Пусть w[i][j] - вес ребра из i в j. Будем обходить граф в порядке топологической сортировки. Получаем следующие соотношения:

[math] d[i] = \min\limits_{\mathop{j:j \rightsquigarrow i}} (d[j] + w[j][i]) [/math]

Так как мы обходим граф в порядке топологической сортировки, то на i-ом шаге во всех d[j] (j такие, что: /exist ребро из j в i) уже записаны оптимальные ответы, и следовательно в d[i] так же будет записан оптимальный ответ.

Реализация

Реализуем данный алгоритм методом "динамика вперед":

 //d, w - матрицы как в описании, p - массив индексов вершин графа в порядке топологической сортировки, i, j - счетчики 
inputData() //считывание данных
for i = 1 to n d[i] = infinity
p = topSort() //топологическая сортировка
d[p[u]] = 0
for i = 1 to n for j: /exist p[i] \rightsquigarrow j d[j] = min(d[j], d[p[i]] + w[p[i]][j])
writeData(); // запись данных

Пример

граф из примера

Пусть дан граф со следующими весами w ребер:

1 2 3 4
1 0 - - 1
2 2 0 1 -
3 - - 0 1
4 - - - 0

Требуется найти путь из 1 в 4. Матрица p будет выглядеть следующим образом:

1 2 3 4
2 1 3 4

Матрица d будет выглядеть следующим образом:

1 2 3 4
1 0 2 2

Ответ равен 2.

Источники