Вы можете свести задачу к классической задаче кратчайшего пути и использовать Дейкстру, Беллмана-Форда или Флойд-Варшала в зависимости от цели.Для простоты в дальнейшем я предполагаю, что все веса неотрицательны.Я считаю такое предположение разумным, поскольку в вопросе упоминается использование алгоритма Дейкстры для решения проблемы.В конце концов, это предположение можно осторожно удалить.
Рассмотрим наиболее общую форму задачи: предположим, что G = <V, E>
- это ориентированный взвешенный граф с весами на ребрах и вершинах.Построить график H = <V', E'>
с весами только по ребрам следующим образом: Для любого узла v
в G
создайте два узла v_in
и v_out
в H;добавить ребро (v_in -> v_out)
с весом, равным весу узла v
в G
.Кроме того, для любого ребра (u -> w)
в G
добавьте ребро (u_out -> w_in)
в H (новое ребро имеет тот же вес, что и исходное ребро).
Чтобы подвести итог, для любой вершины в исходном графе добавьте две вершины в H
, одну, предназначенную для входящих ребер, а другую, предназначенную для исходящих ребер (также, подключите новые коррелированные узлы вH
на основе веса их соответствующей вершины в G
).
Теперь у вас есть ориентированный взвешенный граф H
без веса на вершинах, но только на ребрах.Легко доказать, что кратчайший путь между (s_in, t_out)
в H
совпадает с кратчайшим путем между (s,t)
в исходном графе G
.
Доказательство основано на том факте, что любой такой путь проходит через ребро (v_in, v_out)
в H
тогда и только тогда, когда соответствующий путь в G
проходит через узел v
.
Что касается анализа, у нас есть |V'| = 2|V|
и |E'| = |E| + |V|
.Таким образом, сокращение не влияет на асимптотику используемого алгоритма для поиска кратчайших путей.