हर कोई इसकी तुलना ट्रैवलिंग सेल्समैन समस्या से कर रहा है, शायद आपने अपने सवाल को ध्यान से नहीं पढ़ा है। टीएसपी में, उद्देश्य सबसे छोटा चक्र ढूंढना है जो सभी कोने (एक हैमिल्टन चक्र) का दौरा करता है - यह 'मस्टपास' लेबल वाले प्रत्येक नोड से मेल खाता है ।
आपके मामले में, यह देखते हुए कि आपके पास केवल एक दर्जन लेबल 'मस्टपास' हैं, और उसने 12 दिए हैं! बल्कि छोटा (479001600) है, आप बस केवल 'मस्टपास' नोड्स के सभी क्रमांकन की कोशिश कर सकते हैं, और 'स्टार्ट' से 'एंड' तक के सबसे छोटे रास्ते को देख सकते हैं जो उस क्रम में 'मस्टपास' नोड्स पर जाता है - यह बस होगा उस सूची में हर दो लगातार नोड्स के बीच सबसे छोटे रास्तों का संयोजन होना चाहिए।
दूसरे शब्दों में, पहले प्रत्येक जोड़ी के बीच की सबसे छोटी दूरी पाते हैं (आप दिज्क्स्ट्रा के एल्गोरिथ्म या अन्य का उपयोग कर सकते हैं, लेकिन उन छोटी संख्याओं (100 नोड्स) के साथ, यहां तक कि सबसे सरल-टू-कोड फ्लोयड-वारशॉल एल्गोरिथ्म समय में चलेगा)। फिर, एक बार जब आपके पास यह तालिका होती है, तो अपने 'मस्टपास' नोड्स, और बाकी के सभी क्रमपरिवर्तन का प्रयास करें।
कुछ इस तरह:
//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 'मस्टपास' नोड्स हैं, तो इसका रनिंग टाइम फ्लोयड-वारशॉल भाग के लिए O (n 3 ) है, और O (k! N! ) सभी क्रमपरिवर्तन भाग के लिए, और 100 ^ 3 + (12!) (100) व्यावहारिक रूप से मूंगफली है जब तक कि आपके पास वास्तव में कुछ प्रतिबंधात्मक बाधाएं नहीं हैं।]