Все остальные, сравнивающие это с проблемой коммивояжера, вероятно, не внимательно прочитали ваш вопрос. В TSP цель состоит в том, чтобы найти кратчайший цикл, который посещает все вершины (гамильтонов цикл) - это соответствует тому, что каждый узел помечен как «mustpass».
В вашем случае, учитывая, что у вас всего около дюжины с пометкой «mustpass», и с учетом этого 12! довольно мала (479001600), вы можете просто попробовать все перестановки только узлов 'mustpass' и посмотреть на кратчайший путь от 'start' до 'end', который посещает узлы 'mustpass' в этом порядке - он просто быть конкатенацией кратчайших путей между каждыми двумя последовательными узлами в этом списке.
Другими словами, сначала найдите кратчайшее расстояние между каждой парой вершин (вы можете использовать алгоритм Дейкстры или другие, но с этими небольшими числами (100 узлов) даже простейший алгоритм Флойда-Уоршалла будет работать со временем). Затем, когда у вас есть это в таблице, попробуйте все перестановки ваших «mustpass» узлов и все остальное.
Что-то вроде этого:
//Precomputation: Find all pairs shortest paths, e.g. using Floyd-Warshall
n = number of nodes
for i=1 to n: for j=1 to n: d[i][j]=INF
for k=1 to n:
for i=1 to n:
for j=1 to n:
d[i][j] = min(d[i][j], d[i][k] + d[k][j])
//That *really* gives the shortest distance between every pair of nodes! :-)
//Now try all permutations
shortest = INF
for each permutation a[1],a[2],...a[k] of the 'mustpass' nodes:
shortest = min(shortest, d['start'][a[1]]+d[a[1]][a[2]]+...+d[a[k]]['end'])
print shortest
(Конечно, это не настоящий код, и если вам нужен реальный путь, вам нужно будет отслеживать, какая перестановка дает кратчайшее расстояние, а также каковы кратчайшие пути для всех пар, но вы поняли идею.)
Он будет работать не более чем за несколько секунд на любом подходящем языке :)
[Если у вас есть n узлов и k узлов 'mustpass', время его работы будет O (n 3 ) для части Флойда-Уоршалла и O (k! N ) для части со всеми перестановками, а 100 ^ 3 + (12!) (100) практически пустяки, если только у вас нет действительно ограничивающих ограничений.]