Что вы можете сделать, это преобразовать ваш график (V,E)
в (V',E')
, где
P(v)
- цена исходного узла v
R
- максимальное использование ресурса.
V' = {(v,k) | v in V and k in [0..R]}
E'((v,k),(w,l)) = E(v,w) and k+P(w)=l
Затем вы выполняете поиск dijkstra из (v0,P(v0))
. Если можно было найти путь к v1
, то с учетом ограничения самое короткое расстояние до него будет самым коротким из (v1,k)
вершин.
Вы явно не создаете фактический расширенный график. То, что будет происходить в вашем модифицированном dijkstra, заключается в том, что в дополнение к расстоянию вы также сохраните использование ресурсов. Вы бы пошли по пути, только если он не превысил предел. И вместо того, чтобы хранить dist[v]
, вы бы сохраняли dist[v,k]
, представляющий кратчайший путь до v, используя ровно k
ресурсов.
Если ваша привязка к ресурсу очень велика, она потенциально может вырасти до большой. Отсюда и полнота НП. Однако, если ваш ресурс ограничен, или вы не возражаете против округления до ближайших 10, 100 или 1000, он будет выполняться за быстрое полиномиальное время.
Особенно, если вы реализуете оптимизацию остановки после того, как достигли полезного значения (v1,k)
.