48
правок
Изменения
Нет описания правки
==Формулировка задачи==Пусть дан ациклический взвешенный граф. Требуется найти вес кратчайшего пути из '''u''' в '''v''' {{Определение|definition= '''Кратчайший путь''' из '''u''' в '''v''' – это любой такой путь из '''u '''в ''p'v'' ', что его вес меньше или равен веса любого другого пути из '''u '''в '''v'''}}==Решение==Пусть d — матрица, для которого <tex> w(p) = \delta(где d[i] — вес кратчайшего пути из '''u''' в '''i'''. Изначально значения d равны бесконечности, v)</tex>кроме d[u], гдекоторый равен 0. Пусть w[i][j] - вес ребра из '''i''' в '''j'''. Будем обходить граф в порядке топологической сортировки. Получаем следующие соотношения: <br>* <tex>\boldsymbol w(p) </tex> = сумма весов всех ребер пути p *<tex>\rm{\delta}(u, v) d[i] = \leftmin\limits_{\beginmathop{arrayj:j \rightsquigarrow i}{llcl}(d[j] + w[j][i]) </tex>
== Реализация==Реализуем данный алгоритм методом "динамика вперед": //d, w - матрицы как в описании, p - матрица индексов вершин графа в порядке топологической сортировки, i, j - счетчики <br /> inputData() //считывание данных <br /> for i = 1 to n d[i] = infinity <br /> topSort() //топологическая сортировка <br /> d[p[u]] = 0 <br /> for i = 1 to n for j: /exist p[i] \rightsquigarrow j d[j] = min(d[j], d[p[i]] + w[p[i]][j]) <br /> writeData(); // запись данных
Ответ будет равен 2.
==Источники==
* [http://ru.wikipedia.org/wiki/Динамическое_программирование Википедия]
[[Категория: Динамическое программирование ]]