минимальным является расстояние D[u] = Min(D[p]|p ∈ T )
7 T = T \ {u}
8 f or(v ∈ T )D[v] = Min(D[v], D[u] + A[u][v])
9 }
Проанализируем временную оценку алгоритма Дейкстры. Очевидно, что внеш-
ний цикл выполняется (n − 1) раз, причем каждое его выполнение требует O(n)
шагов: O(n) для нахождения вершины u в строке 6 (предположим, что множество
T представлено списком ) и O(n) шагов для выполнения цикла 8. Таким образом,
временная сложность алгоритма Дейкстры составляет O(n
2
). При хорошем представ-
лении структур данных в виде бинарного дерева можно получить вариант алгоритма
со сложностью O(m · log
2
n), где m — число дуг графа.
Рассмотрим теперь технический прием, представляющий развитие области при-
менения метода Дейкстры. На практике часто встречаются задачи, в которых можно
построить граф состояний исследуемого объекта. Известно начальное состояние и
требуется кратчайшим путем перевести объект в некоторое конечное состояние. Как
правило, число состояний такого объекта достаточно велико и, следовательно, мат-
рицу переходов невозможно разместить в памяти компьютера. На помощь приходят
виртуальные графы, т.е. графы, которые не описаны явно и не присутствуют в памя-
ти программы. Анализ алгоритма Дейксты показывает, что для вычисления нового
значения минимального расстояния D[v] = Min(D[v], D[u] + A[u][v]) требуется длина
дуги (u, v) между двумя заданными вершинами. Для вычисления этого расстояния
необходимо написать функцию, которая возвращает длину дуги для двух заданных
состояний. Эти состояния в программе могут определяться как своими номерами,
так и некоторыми параметрами, однозначно определяющими эти состояния.
Пример.
2
Ребенку подарили набор из F фломастеров разных цветов. Желая проверить
новые фломастеры, ребенок нарисовал N пронумерованных цветных кружков, затем
соединил некоторые из них цветными ориентированными дугами. Любые два кружка
могут быть соединены любым количеством дуг любых цветов. Каждый цвет (либо
кружка либо дуги ) имеет свой номер от 1 до K. В начале игры ребенок выбирает три
целых числа L, K, Q, лежащие в пределах от 1 до N. Затем он ставит одну фишку
на кружок с номером Q, а другую — на кружок с номером K. После этого ребенок
начинает передвигать фишки, в соответствии со следующими правилами:
- фишка может пройти дугу в том случае, если цвет этой дуги совпадает с цветом
кружка, на котором стоит другая фишка;
- фишка может двигаться только в направлении ориентации дуги;
- две фишки нельзя ставить на один и тот же кружок одновременно;
- очередность ходов фишек не установлена, т.е. не обязательно двигать первую и
вторую фишки по очереди;
- только одна фишка может быть передвинута за один ход;
- один ход представляет собой движение только по одной дуге.
Игра заканчивается, если одна из фишек достигнет кружка с номером Q. Надо
написать программу, которая находит длину кратчайшего возможного пути, если он
существует.
Входные данные
Первая строка содержит числа N, L, K , Q, разделенные пробелами. Вторая строка
содержит N чисел c
1
, c
2
, ..., c
N
, где c
i
— цвет i–го кружка. В третьей строке содер-
жится число M, обозначающее количество ориентированных дуг. Затем следуют M
2
1997-1998 ACM Northeastern European Regional Programming Contest
157