Остов с кратчайшим путем между двумя точками - PullRequest
0 голосов
/ 10 октября 2018

У меня есть взвешенный неориентированный график.Мне нужно найти связующее дерево с минимально возможными затратами, чтобы расстояние между точкой А и В было как можно меньше.Например, у меня есть этот график: график .Минимальное расстояние между A и B составляет 2 .Минимальное связующее дерево будет выглядеть как this .Но это сделало бы расстояние между A и B = 3.

Прямо сейчас я делаю это:

  1. Найти расстояние между AB на графике, используя BFS.
  2. Найдите все пути между AB с длиной из шага 1, используя DFS.
  3. Создайте связующее дерево из каждого пути из шага 2.
  4. Сравните их и получите минимальный.

Все в порядке, пока я не получу график с расстоянием AB = 12. Второй шаг, затем займет слишком много времени.Есть ли более быстрый способ сделать это?Спасибо.

1 Ответ

0 голосов
/ 13 ноября 2018

Хотя ваш второй шаг верен, я думаю, что проблема в том, что вы делаете слишком много операций.

Вы выполняете как BFS, так и DFS, что будет очень дорогостоящим.Вместо этого я бы порекомендовал использовать один из нескольких различных методов обхода, которые позволят минимизировать вычислительные затраты.

Это общая проблема для поиска кратчайшего пути, и одним из популярных решений является алгоритм Дейкстры.Вот статья, которая излагает эту тему.https://www.geeksforgeeks.org/dijkstras-shortest-path-algorithm-greedy-algo-7/

Короче говоря, что этот алгоритм делает, он берет начальную точку A, и затем он генерирует минимальное остовное дерево, пока точка B не будет достигнута, тогда есть единственный путь, по которому A может получитьк B, и это самый короткий путь.

И этот, и ваш алгоритм оба работают в O (nlogn), но на практике это решение можно рассматривать как запуск одной BFS вместо BFS иДФС.

...