Использование динамического программирования.
Вы отслеживаете только путь к узлу, если все пути, которые занимают меньше времени, чем стоимость выше. Когда вы видите новый путь, вы можете использовать двоичный поиск, чтобы найти самый длинный путь времени, который является одним и тем же временем или короче, а затем добавить новый путь, только если он стоит меньше, чем тот, и не превысил лимит времени. Когда вы добавляете его, удалите все существующие пути, которые занимают больше времени и не дешевле.
Наконец, вы получите массив путей к окончательному узлу, который упорядочен по времени. Выберите самый дешевый, который подходит во временном ограничении.
Обратите внимание, что вы, вероятно, хотите, список задач узлов, чтобы рассмотреть, и узел может заводиться в этом списке TODO несколько раз (он обматывает назад на это каждый раз, когда вы находите новый дешевый путь к нему.)