Кратчайший путь в ациклическом графе — различия между версиями
IRomchig (обсуждение | вклад) (→Решение) |
IRomchig (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
− | + | Пусть дан ациклический ориентированный взвешенный граф. Требуется найти вес кратчайшего пути из '''u''' в '''v''' | |
− | Пусть дан ациклический взвешенный граф. Требуется найти вес кратчайшего пути из '''u''' в '''v''' | + | ==Определение== |
{{Определение|definition= '''Кратчайший путь''' из '''u''' в '''v''' – это такой путь из '''u '''в '''v''', что его вес меньше или равен веса любого другого пути из '''u''' в '''v'''}} | {{Определение|definition= '''Кратчайший путь''' из '''u''' в '''v''' – это такой путь из '''u '''в '''v''', что его вес меньше или равен веса любого другого пути из '''u''' в '''v'''}} | ||
==Решение== | ==Решение== | ||
− | Пусть d — | + | Пусть 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> | ||
Строка 14: | Строка 14: | ||
for i = 1 to n | for i = 1 to n | ||
d[i] = infinity <br /> | d[i] = infinity <br /> | ||
− | p = topSort() //топологическая сортировка <br /> | + | p = topSort(w) //топологическая сортировка графа <br /> |
d[p[u]] = 0 <br /> | d[p[u]] = 0 <br /> | ||
for i = 1 to n | for i = 1 to n | ||
− | for j: | + | for j: p[i] смежно с j |
d[j] = min(d[j], d[p[i]] + w[p[i]][j]) <br /> | d[j] = min(d[j], d[p[i]] + w[p[i]][j]) <br /> | ||
writeData(); // запись данных | writeData(); // запись данных | ||
Строка 55: | Строка 55: | ||
==Источники== | ==Источники== | ||
+ | *[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 Принцип оптимальности на подзадаче (в качестве примера разбирается задача поиска кратчайшего пути в ациклическом графе)(англ.)] | * [http://en.wikipedia.org/wiki/Optimal_substructure Принцип оптимальности на подзадаче (в качестве примера разбирается задача поиска кратчайшего пути в ациклическом графе)(англ.)] | ||
[[Категория: Динамическое программирование ]] | [[Категория: Динамическое программирование ]] |
Версия 09:46, 29 ноября 2011
Пусть дан ациклический ориентированный взвешенный граф. Требуется найти вес кратчайшего пути из u в v
Содержание
Определение
Определение: |
Кратчайший путь из u в v – это такой путь из u в v, что его вес меньше или равен веса любого другого пути из u в v |
Решение
Пусть d — массив, где d[i] — вес кратчайшего пути из u в i. Изначально значения d равны бесконечности, кроме d[u], который равен 0. Пусть w[i][j] - вес ребра из i в j. Будем обходить граф в порядке топологической сортировки. Получаем следующие соотношения:
Так как мы обходим граф в порядке топологической сортировки, то на i-ом шаге во всех d[j] (j такие, что: существует ребро из j в i) уже записаны оптимальные ответы, и следовательно в d[i] также будет записан оптимальный ответ.
Реализация
Реализуем данный алгоритм методом "динамика вперед":
//d, w - матрицы как в описании, p - массив индексов вершин графа в порядке топологической сортировки, i, j - счетчики
inputData() //считывание данных
for i = 1 to n d[i] = infinity
p = topSort(w) //топологическая сортировка графа
d[p[u]] = 0
for i = 1 to n for j: p[i] смежно с 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 |
3 | - | - | 0 | 1 |
4 | - | - | - | 0 |
Требуется найти путь из 2 в 4.
Матрица p будет выглядеть следующим образом:
1 | 2 | 3 | 4 |
2 | 1 | 3 | 4 |
Матрица d будет выглядеть следующим образом:
1 | 2 | 3 | 4 |
1 | 0 | 2 | 2 |
Ответ равен 2.