На самом деле Dijkstra с некоторой предварительной обработкой - лучший друг для вас.
Я ответил на проблему, которая может быть похожа на эту: Какова временная сложность, если требуется пересмотреть посещенные узлы в BFS?
Что я вижу общего - вы хотите использовать как можно больше существующих дорог. Также вам иногда нужно сломать это и построить новую дорогу. Суть в том, чтобы установить правильные веса для существующих и для «возможно новых».
Каков будет мой подход - допустим, что каждый 1 км существующей дороги имеет стоимость 1. Вы можете суммировать все существующие дороги на своем графике и предположить, что в общей сложности 1000 км. Затем я предварительно обработал бы весь граф, и из каждого узла (города) я бы создал путь ко всем другим городам, не связанным напрямую, и каждый из них стоил бы 1000 + 1000 за километр, а затем запустил на нем Дейкстру.
Он будет автоматически использовать как можно больше существующих дорог и создавать как можно меньше новых дорог.
Также вы можете немного поиграть с этими настройками, чтобы достичь желаемого.
Представьте, что есть два города, которые находятся всего в 100 метрах друг от друга. А между существующими дорогами есть путь, который занимает 20 000 км. С настройками, которые я предложил, вы получите 20000 км пути как лучший (который удовлетворяет потребности «не строить никаких новых дорог, если в этом нет необходимости»). Иногда вы действительно этого хотите. Иногда нет. Если вы этого не сделаете, вы можете подумать: «Хорошо, если я строю, как немного лишней дороги, и это резко уменьшает расстояние, это еще лучшее решение». Если это так, вы можете подумать о снижении цены на новые дороги (например, удаление первоначальной стоимости, или стоимости за километр, или того и другого - это зависит от того, что вы выберете в качестве наилучшего результата).