Все остальные, сравнивающие это с проблемой коммивояжера, вероятно, не внимательно прочитали ваш вопрос. В 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) - это практически арахис, если у вас нет действительно ограничительных ограничений.]