फोर्ड-बेलमैन एल्गोरिदम
g को n कोने और m किनारों के साथ, और कुछ प्रारंभिक शीर्ष v के साथ एक निर्देशित भारित ग्राफ G दिया जाता है। > . शीर्ष v से अन्य सभी शीर्षों तक सबसे छोटे रास्तों की लंबाई ज्ञात करना आवश्यक है।
दिज्क्स्त्रा की तरह, Ford-Bellman शीर्ष 1 से अन्य सभी की दूरी की तलाश करता है, लेकिन नकारात्मक किनारों के साथ काम करता है< / मजबूत>।
Ford-Bellman एल्गोरिदम में ही कई चरण होते हैं ( n-1 )। प्रत्येक चरण में, ग्राफ़ के सभी किनारों की जांच की जाती है, और एल्गोरिद्म लागत c के प्रत्येक किनारे (a, b) के साथ आराम करने की कोशिश करता है। किनारे पर आराम — यह d[a] मान d[b] + c । वास्तव में, इसका मतलब यह है कि हम किनारे और शीर्ष के लिए वर्तमान उत्तर।
d सरणी प्रारंभिक शीर्ष से सबसे छोटी लंबाई की एक सरणी है, ठीक उसी तरह जैसे दिज्क्स्त्र में, हम शुरू में इसे यथासंभव बड़ी संख्या में भरते हैं, शुरुआती शीर्ष को छोड़कर, जिसमें आपको डालने की आवश्यकता होती है 0.
किनारों को संग्रहीत करने के लिए, आसन्न मैट्रिक्स या भार मैट्रिक्स का उपयोग नहीं किया जाता है, लेकिन एक सूची जो इंगित करती है कि किनारे किस नोड से निकलते हैं (<कोड>सेकोड>), जिसके लिए यह आता है ( to ) कोड>) और उसका वजन (<कोड>लागतकोड>)।
संरचना किनारा {
int से, से, लागत;
};
वेक्टर<किनारे> किनारों;
पूर्व>
INF स्थिरांक "अनंत" संख्या दर्शाता है - इसे इस तरह से चुना जाना चाहिए कि यह स्पष्ट रूप से सभी संभावित पथ लंबाई से अधिक हो।
एल्गोरिथ्म का सबसे सरल कार्यान्वयन:
डी [वी] = 0;
के लिए (int i=0; i<n-1; ++i)
के लिए (int j = 0; j<m; ++j)
अगर (डी[किनारे[जे].से] <आईएनएफ)
डी [किनारे [जे] .से] = न्यूनतम (डी [किनारे [जे] .से], डी [किनारे [जे]। से] + किनारों [जे]। लागत);
पूर्व>
या सिंटैक्स C++11: का उपयोग करके थोड़ा छोटा
डी [वी] = 0;
के लिए (int i=0; i< n-1; ++i)
के लिए (एज जे: किनारों)
अगर (डी[जे.फ्रॉम] <INF)
d[j.to] = min(d[j.to], d[j.from] + j.cost);
पूर्व>
काम का उदाहरण
एक साधारण निर्देशित ग्राफ़ लें 5 नोड्स के साथ, 1 के बराबर वजन वाले 4 किनारे।
आइए इसी क्रम में किनारों की एक सूची पेश करते हैं।
4 5 1
3 4 1
2 3 1
1 2 1
सबसे कम लंबाई की सरणी में प्रारंभिक मान:
<टेबल क्लास = "टेबल-एसएम टेबल-बॉर्डर टेबल-स्ट्राइप्ड टेबल-लिस्ट-टेस्ट">
<शरीर>
0 |
जानकारी |
जानकारी |
जानकारी |
जानकारी |
टेबल>
जहां inf एक मेल खाने वाला पूर्णांक होना चाहिए जो हमेशा किनारे के भार से अधिक होता है।
पहली पास के बाद
<टेबल क्लास = "टेबल-एसएम टेबल-बॉर्डर टेबल-स्ट्राइप्ड टेबल-लिस्ट-टेस्ट">
<शरीर>
0 |
1 |
जानकारी |
जानकारी |
जानकारी |
टेबल>
दूसरे पास के बाद
<टेबल क्लास = "टेबल-एसएम टेबल-बॉर्डर टेबल-स्ट्राइप्ड टेबल-लिस्ट-टेस्ट">
<शरीर>
0 |
1 |
2 |
जानकारी |
जानकारी |
टेबल>
तीसरे पास के बाद
<टेबल क्लास = "टेबल-एसएम टेबल-बॉर्डर टेबल-स्ट्राइप्ड टेबल-लिस्ट-टेस्ट">
<शरीर>
0 |
1 |
2 |
3 |
जानकारी |
टेबल>
चौथी पास के बाद
<टेबल क्लास = "टेबल-एसएम टेबल-बॉर्डर टेबल-स्ट्राइप्ड टेबल-लिस्ट-टेस्ट">
<शरीर>
0 |
1 |
2 |
3 |
4 |
टेबल>
यदि हम किनारों को 1 से अंत तक क्रम में खिलाते हैं, तो हम पहले पास के बाद सबसे कम लंबाई पा सकते हैं।
|