Все пути данной длины между двумя данными узлами в графе

Я столкнулся с этой проблемой:

http://www.iarcs.org.in/inoi/contests/oct2005/Advanced-2.php

Проблема в основном о графах. Вам дают граф максимум с 70 узлами и матрицу смежности, которая говорит, сколько краев существует между двумя узлами. Каждый край двунаправлен.

Теперь вопрос просит, чтобы вы узнали количество отличных путей ФИКСИРОВАННОЙ ДЛИНЫ N между любыми двумя узлами N1 и N2. На пути могут быть повторения. Т.е., путь может пройти уже включенный узел.

naivest алгоритм должен управлять поиском в ширину и проверить, сколько N2 появляется в Энном слое с деревом BFS, внедренным в N1. Но эта работа привычки.

Как пойти об этом?

0
nl ja de

1 ответы

Решение этой проблемы просто - поднимают матрицу смежности до Энной власти, и ответ будет сидеть в клетке (N1, N2) для каждой пары N1 и N2 - основная теория графов.

Можно также использовать двойное возведение в степень из матрицы, чтобы вычислить ответ быстрее.

Чтобы понять , почему делает вышеупомянутую работу алгоритма, попытайтесь записать первые несколько шагов возведения в степень. Вы заметите, что на каждом повторении матрица держит пути данной фиксированной длиной, идущей от 1 до N. Если вы записываете, как клетка вычисляется, выполняя матричное умножение, которое необходимо видеть также, почему это происходит так.

ПРИМЕЧАНИЕ: есть также действительно прохладное хакерское проникновение о том, как вы вычисляете все пути с длиной <сильной> до , фиксированная длина - просто добавляет "петлю" в вершине начала, таким образом делающей его доступный из себя.

7
добавлено
Я просто собираюсь идти вперед и добавлять, что математика потрясающая. уносит мой ум
добавлено автор im so confused, источник
@PushkarMishra я просто добавлял комментарий что:), Пожалуйста, взгляните на мой отредактированный ответ. Никакой problemo с ограничением btw. Необходимо быть в состоянии вычислить это в меньше, чем секунда! Всего хорошего, чтобы использовать тип числа, достаточно большой, чтобы приспособить ответ, хотя
добавлено автор Ivaylo Strandjev, источник
@Khaur благодарит отметить, что я не прочитал заявление, с которым он связался. Вы абсолютно правильны, если это так, интервала достаточно, чтобы сохранить ответ.
добавлено автор Ivaylo Strandjev, источник
@dingalapadum I tgink it' s очевидный, что мой алгоритм не будет работать, если будут петли в yhe графе. В конце концов, если уже есть взгляд на вершину начала, добавляющую, что другой ничего не изменит. Все еще была ошибка в моем примечании - вы только добавляете одну петлю - в вершине начала, иначе вы повторите маршруты. Спасибо за то, чтобы замечать
добавлено автор Ivaylo Strandjev, источник
Также помните, что проблема, к которой вы обращаетесь, просит количество модуля путей 42373, таким образом, можно постараться не идти для действительно высоких чисел как (A*B), модник c = (Ультрасовременный c) * (B ультрасовременный c) также работает на матрицы.
добавлено автор Khaur, источник
Опечатка: уравнение должно, конечно, прочитать" (A*B) модника c = (Ультрасовременный c) * (B ультрасовременный c) ультрасовременный c" (дополнительный модник в конце)
добавлено автор Khaur, источник
Как ПРИМЕЧАНИЕ точно работает? Рассмотрите полный граф на 3 вершинах (треугольник). Матрица прил = [1 1 1; 1 1 1; 1 1 1]. Тогда A*A = [3 3 3; 3 3 3; 3 3 3]. Но есть только два пути длины самое большее 2 от любой вершины до любого другого один. (Например, 1-> 2 и 1-> 3-> 2). Однако результат равняется трем потому что с самопетлями есть точно три пути длины точно 2 (1-> 1-> 2, 1-> 2-> 2 и 1-> 3-> 2). Я don' t понимают, как это - то же самое. Это на самом деле уже ломается, если вы имеете только 2 вершины и просите пути длины самое большее 2. Есть только один такой путь. Ваше ПРИМЕЧАНИЕ предлагает 2.
добавлено автор dingalapadum, источник
Извините за беспорядок. Треугольник = [0 1 1; 1 0 1; 1 1 0]. После добавления петель вы предположили, что матрица - все. Но да, только добавление петли в вершине начала должно работать, я думаю. Хороший!
добавлено автор dingalapadum, источник
почему это работает?
добавлено автор Somebody, источник
и да, n может быть столь же большим как 10^9!
добавлено автор Somebody, источник
Это работало! и я мог разобрать, почему это работает! Спасибо!: D
добавлено автор Somebody, источник