E037. Кратчайшие пути фиксированной длины, количества путей фиксированной длины
Источник: e-maxx.ru/algo, страница PDF 116.
Ниже описываются решения этих двух задач, построенные на одной и той же идее: сведение задачи к возведению матрицы в степень (с обычной операцией умножения, и с модифицированной).
Количество путей фиксированной длины
Пусть задан ориентированный невзвешенный 图
с
vertexми, и заgiven 整数
. it is required для
каждой пары вершин
и
find количество путей между этими vertexми, состоящих ровно из
рёбер. Пути при
этом рассматриваются произвольные, не обязательно простые (т.е. вершины могут повторяться сколько угодно раз).
Будем считать, что 图 задан матрицей смежности, т.е. матрицей
размера
, где каждый
element
равен единице, если между этими vertexми есть edge, и нулю, если ребра нет. Описываемый ниже 算法 работает и в случае наличия кратных рёбер: если между какими-то vertexми
и
есть сразу
рёбер, то в матрицу смежности следует записать это number
. Также 算法 корректно учитывает петли в 图е,
если таковые имеются. Очевидно, что в таком виде матрица смежности 图а является ответом на задачу при
—
она содержит количества путей длины
между каждой парой вершин.
解法 будем строить итеративно: пусть ответ для некоторого
найден, покажем, как построить его для
. Обозначим через
найденную матрицу ответов для
, а через
— матрицу ответов, которую
необходимо построить. Тогда очевидна следующая формула: Легко заметить, что записанная выше формула — не что иное, как произведение двух матриц
и
в самом
обычном смысле: Таким образом, 解法 этой задачи можно представить следующим образом: Осталось заметить, что возведение матрицы в степень можно произвести эффективно с помощью 算法а Бинарного возведения в степень.
Итак, полученное 解法 имеет асимптотику
и заключается в бинарном возведении в
-ую
степень матрицы смежности 图а.
Кратчайшие пути фиксированной длины
Пусть задан ориентированный взвешенный 图
с
vertexми, и заgiven 整数
. it is required для каждой
пары вершин
и
find длину кратчайшего пути между этими vertexми, состоящего ровно из рёбер.
Будем считать, что 图 задан матрицей смежности, т.е. матрицей
размера
, где каждый
element
содержит длину ребра из вершины
в вершину
. Если между какими-то vertexми ребра нет,
то соответствующий element матрицы считаем равным бесконечности
. Очевидно, что в таком виде матрица смежности 图а является ответом на задачу при
—
она содержит длины кратчайших путей между каждой парой вершин, или
, если пути длины
не существует.
解法 будем строить итеративно: пусть ответ для некоторого
найден, покажем, как построить его для
. Обозначим через
найденную матрицу ответов для
, а через
— матрицу ответов, которую
необходимо построить. Тогда очевидна следующая формула: Внимательно посмотрев на эту формулу, легко провести аналогию с матричным умножением: фактически, матрица
умножается на матрицу
, только в операции умножения вместо суммы по всем
берётся минимум по всем
:
где операция
умножения двух матриц определяется следующим образом: Таким образом, 解法 этой задачи можно представить с помощью этой операции умножения следующим образом: Осталось заметить, что возведение в степень с этой операцией умножения можно произвести эффективно с помощью 算法а Бинарного возведения в степень, поскольку единственное требуемое для него свойство — ассоциативность операции умножения — очевидно, имеется.
Итак, полученное 解法 имеет асимптотику
и заключается в бинарном возведении в
-ую
степень матрицы смежности 图а с изменённой операцией умножения матриц.
C# 解法
自动草稿,提交前请检查// C# draft for: Кратчайшие пути фиксированной длины, количества путей фиксированной длины
// Original e-maxx article has no compact code listing in the extracted PDF text.
C++ 解法
匹配/原始// C++ source for: Кратчайшие пути фиксированной длины, количества путей фиксированной длины
// Compact code block was not extracted from this article.
Java 解法
自动草稿,提交前请检查// Java draft for: Кратчайшие пути фиксированной длины, количества путей фиксированной длины
// Original e-maxx article has no compact code listing in the extracted PDF text.
Материал разбит как 算法ическая 题目: изучить постановку, понять асимптотику и реализовать 算法 на выбранном языке.
Vacancies for this task
活跃职位 with overlapping task tags are 已显示.