1) У кого-нибудь есть идея получить число кратчайших путей в неориентированном невзвешенном графе? Я хочу заполнить 2-мерную матрицу, которая имеет число кратчайших путей для любой вершины i, j, 2) другой вопрос заключается в том, как получить число кратчайших путей между двумя вершинами i, j таким образом, что путь должен пройти определенной вершины. Спасибо заранее.число кратчайших путей между двумя вершинами графа
ответ
Dijkstra's algorithm предназначенный для поиска самых коротких путей.
NB Первое Google находит, если вы попытаетесь использовать его с shortest path algorithm
поиск ...
dijkstra находит кратчайший путь, это нормально. Но может быть, например, 3 кратчайших пути между двумя вершинами, мне нужно знать только количество кратчайших путей между двумя указанными вершинами. –
Во время выполнения алгоритма вы можете отслеживать, когда путь имеет тот же вес, что и другой путь к одной и той же вершине. – Veger
http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm Дейкстра является вашим другом. Чтобы найти кратчайший путь, включающий конкретный узел, примените Dijkstra для получения кратчайшего пути от A до B, а затем от B до C. Там это ...
Чтобы получить количество путей, разделяющих одну и ту же стоимость, это должно быть легко изменить Dijkstra для этого, чтобы оставить что-то для вашей домашней работы ... :)
Вы можете использовать BFS для этой ситуации. Вот алгоритм, который я только что сделал из своей памяти о некоторых курсах AI пару лет назад. Я не могу убедиться, что он работает безупречно, но, надеюсь, он даст вам несколько советов.
Давить X(p, d)
обозначить узел X
, родитель которого p
, а расстояние от его родителя - d
.
function findAllShortestPaths(...):
RET = set()
queue = [S(None, 0)]
explored = set()
while queue is not empty:
Node = queue.dequeue()
if Node is the one we're searching for:
if Node is not in RET:
RET.add(Node)
else:
if Node.d <= d of the node in RET:
RET.add(Node)
continue
if Node is not in explored:
explored.add(Node)
else:
if Node.d <= d of the node in explored:
explored.add(Node)
else:
continue
for Child in Node.childrens:
if Child is not in explored:
queue.append(Child(Node, Node.d + 1))
return RET, explored
Вот пример. Предположим, что у вас есть 5-точечный (A, B, C, D, E) график, строки которого связаны следующим образом; AB, BC, CD, DA, EA, EB, EC, ED. Вы хотите найти все кратчайшие пути от А до С.
Пусть X(parent, distance) ---> Y(...) Z(...)
означает, что X добавлен в исследуемый набор, Y и Z - это дети X, и они добавляются в очередь.
A(None, 0) ---> B(A, 1) E(A, 1) D(A, 1)
B(A, 1) ---> E(B, 2) C(B, 2)
E(A, 1) ---> C(E, 2) D(E, 2)
D(A, 1) ---> C(D, 2)
[E(B, 2) already in the explored list and the distance is 2 > E(A, 1), continue.]
C(B, 2) ---> Our GOAL, add to RET
C(E, 2) ---> Our GOAL, C already in RET but distance is equal, add to RET
[D(E, 2) already in the explored list and the distance is 2 > D(A, 1), continue.]
C(D, 2) ---> Our GOAL, C already in RET but distance is equal, add to RET
Наконец, RET содержит С (В, 2), С (Е, 2), C (D, 2). Отсюда и в сочетании с разведанным списком можно вернуться к исходному узлу. Например, C(B, 2) B(A, 1) A(None, 0)
.
Возможно, есть некоторые ошибки, но я думаю, что это не имеет большого значения. По второму вопросу это не так уж и далеко, как только мы разобрались в первом. Надеюсь, это поможет!
Пусть admat - матрица смежности для вашего графика. Затем
admat дает длину 1 путь между вершинами;
admat^2 дает длину 2 пути между вершинами;
admat^3 дает длину 3 пути между вершинами;
spot pattern еще?
Использование BFS позволяет свести к минимуму сложность.
Используйте BFS, и нам нужно сохранить дополнительный счетчик, чтобы Sum (w) в каждом слое.
let s - начальная вершина, и нам нужно найти нет кратчайшего пути к v.
то пусть w - узел в L (j-1), а v - в L (j).
тогда S (v) = суммирование {S (w)} + 1;
и S (v) обозначает не по кратчайшему пути между х и v.
- 1. отыскания всех кратчайших путей между двумя вершинами
- 2. Число кратчайших путей на графике
- 3. Подсчет путей между двумя вершинами по графику
- 4. Как найти количество различных кратчайших путей между двумя вершинами, в ориентированном графе и с линейным временем?
- 5. Как проверить связь графа между двумя вершинами
- 6. Поиск кратчайших путей ориентированного графа C++
- 7. Поиск всех возможных путей между всеми вершинами графа
- 8. Алгоритм для нахождения числа кратчайших путей
- 9. Найти число кратчайших путей, не пересекающих край,
- 10. Найдите количество путей, проходящих через ребро между двумя вершинами
- 11. Макс из списка всех кратчайших путей между двумя узлами
- 12. C# алгоритм поиска всех путей между двумя вершинами
- 13. Все пары кратчайших путей длины для неориентированного взвешенного разреженного графа
- 14. Как считать все кратчайшие пути между двумя вершинами?
- 15. Django поиск путей между двумя вершинами в графе
- 16. Поиск всех возможных путей между двумя вершинами в quickgraph
- 17. Шифр запроса кратчайших путей между множеством узлов
- 18. Алгоритм кратчайших путей, который сохраняет прямые соединения?
- 19. Оптимизация поиска всех кратчайших путей в графе с N вершинами и N ребрами
- 20. Число различных шагов минимальной стоимости между двумя вершинами
- 21. Как найти все кратчайшие пути между двумя заданными вершинами в неориентированном графе?
- 22. Добавление весов ко всем ребрам графа - изменение остовного дерева и кратчайших путей
- 23. Все пути между двумя вершинами в R
- 24. Алгоритм Дийкстры для вычисления N кратчайших путей
- 25. Найти путь между двумя вершинами с x красными вершинами
- 26. Использование алгоритма Флойда-Варшалла для подсчета количества путей между двумя вершинами
- 27. Комплексные сети - поиск всех возможных кратчайших путей между парой узлов
- 28. Подсчитайте количество кратчайших путей на доске
- 29. Как удалить границу между двумя вершинами?
- 30. Добавление края между двумя несвязанными вершинами
Когда я учился в колледже, это было своего рода вопросы мой профессор попросил меня разрешить. – GvS
Если кто-либо не представит полный ответ на вопрос, это не обман. Но больше похоже на свидетелей, объясняющих метод решения домашней проблемы. – Veger
-1: Если люди отвечают на ваш вопрос, вежливо внимательно прочитать эти ответы, подумать об этом, попробовать, задать связанные вопросы и т. Д. Вы просто уволите их даже после того, как люди добавили несколько дополнительных советов ... – Veger