найти, существует ли путь определенной длины в ациклическом графе

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

Обратите внимание, что граф имеет максимум 50 узлов и 100 ребер.

Я попытался найти все пути с помощью DFS, а затем проверить, существует ли этот путь между двумя узлами, но получил от онлайн-судьи ответ «Превышено время».

Я также использовал алгоритм поиска унифицированной стоимости, но также получил отрицательный ответ.

Мне нужен более эффективный способ решения такой проблемы. Спасибо.


person Traveling Salesman    schedule 20.06.2012    source источник


Ответы (4)


Я не знаю, будет ли это быстрее, чем подход DFS, но это даст выполнимое решение:

Представьте граф в виде матрицы A и вычислите A^L - путь длины L между i и j существует тогда и только тогда, когда A[i][j] != 0

Кроме того, что касается решения DFS: вам не нужно находить все пути в DFS — вам следует ограничиться путями длиной ‹= L, и тем самым обрезать некоторые поисковые запросы. , как только длина превысит необходимую длину. Вы также можете избежать поиска, когда путь длины L достигает цели.

Другой возможной оптимизацией может быть двунаправленный поиск.

  • Найдите все вершины, у которых есть путь длины L/2 от источника до них.
  • Затем найдите все вершины, у которых есть пути длины L/2 от них к цели (DFS на обратном графе)
  • Затем проверьте, есть ли общая для обоих наборов вершина, если есть — вы получили путь длины L от источника к цели.
person amit    schedule 20.06.2012

Поскольку граф ацикличен, вы можете упорядочить вершины топологически. Назовем начальную вершину А и конечную вершину В.

Теперь запускается основной алгоритм: для каждой вершины посчитайте все возможные расстояния от A до этой вершины. В начале есть один путь из A в A с нулевой длиной. Затем возьмите вершины в топологическом порядке. Когда вы выбираете вершину x: посмотрите на каждого предшественника и обновите здесь возможные расстояния.

Это должно выполняться за время O(N^3).

person usamec    schedule 20.06.2012
comment
начальный и конечный узлы указаны в задаче. - person Traveling Salesman; 20.06.2012

Вы можете использовать модифицированный алгоритм Дейкстры, в котором вместо сохранения для каждой вершины минимального расстояния до начала координат вы сохраняете все возможные расстояния меньше или равные желаемому.

person salva    schedule 21.06.2012

Я считаю, что вы можете использовать следующий алгоритм, чтобы найти самый длинный путь в дереве. Это предполагает, что ваш график подключен, если это не так, вам нужно будет повторно запустить это для каждого подключенного компонента:

  1. Выберите произвольный узел, A.
  2. Выполните BFS (или DFS) из A, чтобы найти узел в дереве, самый дальний от A, назовите этот узел B.
  3. Выполните BFS (или DFS) из B, чтобы найти узел в дереве, самый дальний от B, назовите этот узел C.
  4. Путь от B до C — самый длинный путь в дереве (возможно, связанный для самого длинного).

Очевидно, что если этот путь длиннее L, то его можно сократить, чтобы найти путь длины L.

person Running Wild    schedule 20.06.2012
comment
Согласно вашему алгоритму, если вы можете перейти из B в другой узел, то почему мы остановились на B на шаге 2? Разве мы не должны продолжать идти к самому дальнему? Каково ваше определение узла, являющегося самым дальним? Как называется алгоритм, который вы здесь предлагаете? - person Traveling Salesman; 20.06.2012
comment
Мы останавливаемся на B, потому что должны, это конечный узел, и больше некуда идти. Затем мы делаем другой поиск, начиная с B, мы достигнем A, но затем мы пойдем дальше и доберемся до C. Узел X является самым дальним от узла Y, если не существует узла Z такого, что расстояние от X до Z больше, чем от X до Y. - person Running Wild; 20.06.2012
comment
Не знаю, есть ли у этого алгоритма название — я придумал его еще в школе. Мне нужно было доказать это в то время, но я помню, что доказательство было немного утомительным, поэтому я не хотел пытаться переделывать его здесь. - person Running Wild; 20.06.2012
comment
Не думаю, что вопрос о деревьях. - person usamec; 20.06.2012
comment
@usamec - Ну, речь идет об ациклических графах, а ациклические графы - это деревья. - person Running Wild; 21.06.2012
comment
@RunningWild — ориентированный граф может быть ациклическим и не быть деревом. - person usamec; 21.06.2012
comment
@usamec - Он не сказал, что это было направлено. - person Running Wild; 21.06.2012