E037. Кратчайшие пути фиксированной длины, количества путей фиксированной длины

e-maxx algorithm original: C/C++ #algorithm #emaxx #graph #shortest-path
题目文本会按所选界面语言从俄语翻译;代码保持不变。

Источник: 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 已显示.

所有职位
目前还没有活跃职位。