Хочу представить вам свой метод поиска минимального пути в графе
Он может использоваться как для неориентированного графа с положительными ребрами, так и для ориентированного с отрицательными ребрами (для нахождения минимального пути в таком графе не должно быть отрицательных циклов, алгоритм это определяет).
Собственно, начинаем мы с исходной вершины, которая имеет статус активной (вершины могут быть активными и неактивными), каждая вершина (будь она активна или неактивна) характеризуется следующими параметрами:
1. Активностью, т.е. для этой вершины проделываем определенный алгоритм, после чего она становится неактивной до определенного времени (которое может и не наступить)
2. Временем достижения (длиной маршрута от начальной точки), оно может меняться в процессе работы алгоритма, пока не придет к минимальному
3. Ребром прихода, по которому пришел сигнал от другой активной вершины.
Собственно, на каждом этапе мы имеем определенное количество активных вершин, для каждой активной вершины проделываем следующий алгоритм
Делаем ее неактивной и посылаем сигналы ко всем ребрам этой вершины, кроме ребра прихода, и для каждой достигнутой таким способом вершины производим операцию:
Если принесенное нами время (которое равно времени достижения нашей предыдущей вершины плюс вес ребра) меньше, чем время достижения вершины, которой мы сейчас достигли, то мы выставляем в этой вершине наше новое время, новое ребро прихода (откуда мы пришли) и делаем ее активной. Если нет, то ничего не меняем. (по умолчанию у всех вершин нулевое время достижения, и нет ребра прихода)
Продолжаем работу нашего алгоритма до тех пор, пока не останется ни одной активной вершины.
После работы нашего алгоритма у каждой вершины будет свое минимальное время прихода (минимальная длина маршрута) от начальной точки. Мы также можем восстановить минимальную траекторию до начальной точки, просто двигаясь по ребрам прихода.
Если в графе есть отрицательный цикл, то алгоритм будет работать бесконечно долго, в таком случае условием его остановки будет момент, когда одно из времен достижения станет меньше суммы всех отрицательным ребер в графе.
Сложность такого алгоритма полиномиальная -
без отрицательных ребер, а с отрицательными может быть
Что скажете?