Я думаю, что это может быть сведено к проблеме коммивояжера . Создайте преобразованный граф, в котором узлы представляют обязательные ребра, а веса ребер представляют количество необязательных ребер, которые необходимо пройти, чтобы перейти от одного обязательного ребра к другому.
Теперь проблема состоит в том, чтобы найти кратчайший путь в этом преобразованном графе, который проходит через все узлы (или обязательные ребра). Это TSP, который является NP-hard.
Будут некоторые осложнения, потому что пути, которые вы можете выбрать после обязательного ребра, зависят от направления, в котором вы его выбрали. Вы можете решить эту проблему, превратив каждое обязательное ребро в два узла, по одному для каждого направления. Тогда TSP должен будет посетить ровно один узел из каждой пары.
, например
A===C
| /
| / (edges A<->B and B<->C are compulsory, A<=>C is optional)
|/
B
Преобразованный график:
Узлы = {AB, BA, BC, CB}
Края = {AB -> BC (стоимость 0), BA -> CB (стоимость 1), CB -> BA (стоимость 0), BC -> AB (стоимость 1)}