Для поиска кратчайших путей между любыми двумя парами вершин можно использовать |V |запусков алгоритма 7 «Алг. Дейкс-
тры», что даст эффективное решение этой задачи алгоритмом со сложностью O(n
3
). Также, алгоритм 7 «Алг. Дейкст-
ры» будет работать на ориентированных графах с неотрицательными весами.
Однако такой подход не будет работать на задаче о кратчайших путях на ориентированном графе, ребра которого
могут иметь отрицательные веса (с запретом на наличие в графе циклов отрицательной длины, т.к. очевидно, что при их
наличии оптимального решения быть не может).
Задача 5 Задан ориентированный граф G = (V, E), и весовая функция на ребрах w
e
: e → Z, отображающая
ребра в целые числа, такая, что в графе нет цикла отрицательной длины. Найти минимальные длины путей
между любой парой вершин.
Для решения этой задачи можно применять эффективный алгоритм 8 «Алг. Флойда-Уоршолла» (Алгоритм Флойда-
Уоршолла), использующий методы динамического программирования. В этом алгоритме последовательно выполня-
ются n = |V | итераций, улучшая матрицу D
ij
минимальных стоимостей пути из вершины i в вершину j, с возмож-
ным использованием (для k-той итерации) промежуточных вершин из множества 1, . . . , k. Вычислять эту матрицу
очень легко, изначально она определяется весовой функцией ребер, D
0
ij
= w
ij
, для тех i и j, для которых есть реб-
ро (i, j), и +∞ для остальных. Обновление этой матрицы на k-той итерации происходит по очевидной формуле: D
k
ij
=
min(D
k−1
ij
, D
k−1
ik
+ D
k−1
kj
), где D
k−1
— значение этой матрицы на предыдущей итерации. Таким образом, очевидна и
корректность алгоритма 8 «Алг. Флойда-Уоршолла», и его сложность, состовляющая O(n
3
).
В иллюстрации работы алгоритма 8 «Алг. Флойда-Уоршолла» приведен вывод промежуточных структур и изобра-
жен входной граф (пунктирные дуги между двумя вершинами показывают минимальную стоимость пути между этими
вершинами, если она не совпадает со «входной» стоимостью на дуге между ними).
Таким образом, методы «жадных алгоритмов» и «динамического программирования» (подробнее о них будет рас-
сказано в следующих лекциях), позволили построить эффективные (более детально о понятии эффективности тоже
потом) алгоритмы, для задач, очевидным решением которых был полный перебор, требующий экспоненциального вре-
мени.
Задача 3 «TSP» и задачи о кратчайших путях чрезвычайно похожи по своей структуре, и мы постарались подчерк-
нуть это сходство в их формулировках.
Таким образом, сравнительно успешно устранив перебор для задач о кратчайших путях, естественно задаться ана-
логичным вопросом для задачи 3 «TSP». Довольно быстро оказывается, впрочем, что ни один из «естественных» мето-
дов сокращения перебора к последней задаче неприменим. Таким образом, встает законный вопрос, а можно ли вообще
решить задачу 3 «TSP» с помощью точного алгоритма, существенно более эффективного, нежели переборный?
Одним из главных достижений теории сложности вычислений является стройная и элегантная теория NP-полноты,
позволяющая в 99% случаев дать вполне удовлетворительный ответ на этот вопрос.
Эта теория будет рассмотрена далее, пока же термин NP-полная задача можно понимать неформально в смысле
труднорешаемая переборная задача, для которой существование алгоритма намного более эффективного
нежели простой перебор вариантов, крайне маловероятно.
В частности, в одном из первых исследований было показано, что задача 3 «TSP» NP-полна, и тем самым на
возможность построения для нее точного эффективного алгоритма рассчитывать не приходится.
Соответственно этому, следующий вопрос, на который пытается ответить теория сложности вычислений — это
какие рекомендации можно дать практическому разработчику алгоритмов в такой ситуации, т.е. в тех случаях, когда
результаты диагностики интересующей его задачи на существование для нее точных эффективных алгоритмов столь
же неутешительны, как в случае задачи 3 «TSP». Одна из таких рекомендаций состоит в следующем: попытаться про-
анализировать постановку задачи и понять, нельзя ли видоизменить ее формулировку так, чтобы с одной стороны новая
формулировка все еще была бы приемлема с точки зрения практических приложений, а с другой стороны — чтобы в
этой формулировке задача уже допускала эффективный алгоритм. Кстати, в качестве побочного продукта в ряде слу-
чаев такой сложностной анализ позволяет лучше понять природу задачи уже безотносительно к ее вычислительной
сложности.
Например, пусть некий начинающий проектировщик сетей задумал спроектировать оптимальную компьютерную
сеть, соединяющую n корпусов общежитий. Он только что изучил кольцевые топологии сети и вознамерился проло-
жить кольцевой сетевой маршрут через все корпуса общежитий. Стоимость прокладки кабеля между любыми двумя
корпусами известна (если между какими-то корпусами кабель проложить нельзя, например из-за постоянных работ
по ремонту теплотрасс, то стоимость полагается равной +∞). Формулировка этой задачи в чистом виде совпадает с
задачей 3 «TSP». Как мы уже видели раньше, если число корпусов больше 10, то проектировщику потребуется доступ
к дорогой вычислительной технике, если еще увеличить размер задачи, то можно не получить оптимальное решение за
время жизни проектировщика.
Что же делать незадачливому проектировщику сети? Почитав дальше книгу по проектированию сетей, он решает
построить минимальную связную сеть, используя минимальные связные (из n − 1 дуги) подграфы исходного потен-
13