> For the complete documentation index, see [llms.txt](https://phitron.gitbook.io/algorithm/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://phitron.gitbook.io/algorithm/bellmanford-floyd-warshall/_-bellmanford-algorithm.md).

# মডিউল ৭\_২ঃ Bellmanford Algorithm

আমরা এখন Bellmanford এলগোরিদম কিভাবে কাজ করে সেটা সম্পর্কে জানব। সেটার জন্য আমরা নিচের গ্রাফটিকে বিবেচনা করি।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FQDG0pZcSJTnDKg6qupi7%2Fimage.png?alt=media&amp;token=613f5a69-63ae-435f-9cbd-95a76d6bcbec" alt="" width="375"><figcaption></figcaption></figure>

Bellmanford এলগোরিদম এর ক্ষেত্রে আমাদের মাথায় রাখতে হবে এই এলগোরিদম এজ লিস্ট ধরে কাজ করে। তার মানে এইটি প্রতিটি এজ এর কাছে যায় এবং তাকে রিল্যাক্স করা পসিবল কিনা চেক করে।

উপরের গ্রাফটির এজ লিস্টটি যদি খেয়াল করি তাহলে বলতে পারিঃ

০->২

১->৩

২->১

০->৩

তাহলে এখন প্রশ্ন আসতে পারে যে কয়বার রিল্যাক্স করব? তার উত্তর হচ্ছে যে Bellmanford এলগোরিদম worst case এ প্রতিবার একটা করে নোড এর শর্টেস্ট ডিস্টেন্স বের করতে পারে। তাহলে যদি N সংখ্যক নোড থাকে তাহলে N-1 বার রিল্যাক্স করলেই বলতে পারি যে সোর্স থেকে সকল নোড এর শর্টেস্ট ডিস্টেন্স পাওয়া সম্ভব।

এবার তাহলে আমরা আমাদের মেইন প্রসেসটা দেখি।যেহেতু এখানেও পাথ রিল্যাক্স করব তাই শুরুতে সকল নোড এর ডিস্টেন্স ইনফিনিটি ধরে নিলাম ও সোর্স এর ডিস্টেন্স ০ ধরে নিলাম।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FfZWdFKCkPxGRGRyt9a8N%2Fimage.png?alt=media&amp;token=0c43ec75-60e0-4571-b2de-fd8a7095ab70" alt="" width="332"><figcaption><p><strong>বি দ্রঃ এখানে নীল রং দিয়ে Distance আর কমলা রঙ দিয়ে কস্ট বোঝানো হচ্ছে।</strong></p></figcaption></figure>

প্রথমে আমরা ০->২ এজকে সিলেক্ট করি। তাহলে

dis\[0]+cost(0,2) = 5\<infinite

তাই ২ এর ডিস্টেন্স আপডেট হয়ে হবে ৫।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FmskDUODQ9hHsPzyuSvve%2Fimage.png?alt=media&amp;token=8258fa47-568a-45cf-8760-be98b00cb8d6" alt="" width="375"><figcaption><p><strong>বি দ্রঃ এখানে নীল রং দিয়ে Distance আর কমলা রঙ দিয়ে কস্ট বোঝানো হচ্ছে।</strong></p></figcaption></figure>

এবার ১->৩ কে সিলেক্ট করব।

dis\[1]+cost(1,3) = infinte+3 > infinite

তাই ১->৩ আপডেট হবে না।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2F7ySspMZoK1IHYjpMlmLQ%2Fimage.png?alt=media&amp;token=ed506ddf-86fd-45b4-b64f-114322555db0" alt="" width="375"><figcaption><p><strong>বি দ্রঃ এখানে নীল রং দিয়ে Distance আর কমলা রঙ দিয়ে কস্ট বোঝানো হচ্ছে।</strong></p></figcaption></figure>

এবার ২->১ এজকে সিলেক্ট করব।

dis\[2]+cost(2,1) = 5+2 = 7< infinity

তাই ১ এর ডিস্টেন্স আপডেট হয়ে হবে ৭।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FUNTlVwzNMvbHt8ERbaYB%2Fimage.png?alt=media&amp;token=a83b9fb2-87e6-4b79-b709-75e18aeca045" alt="" width="374"><figcaption><p><strong>বি দ্রঃ এখানে নীল রং দিয়ে Distance আর কমলা রঙ দিয়ে কস্ট বোঝানো হচ্ছে।</strong></p></figcaption></figure>

এবার ০->৩ এজকে সিলেক্ট করব।

dis\[0]+cost(0,3) = 0+12 = 12< infinity

তাই ৩ এর ডিস্টেন্স আপডেট হয়ে হবে ১২।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FtR0PkBLg6zDJsZ2xL9k1%2Fimage.png?alt=media&amp;token=63c27fa7-bd3d-4623-99e6-1bd960519261" alt="" width="318"><figcaption><p><strong>বি দ্রঃ এখানে নীল রং দিয়ে Distance আর কমলা রঙ দিয়ে কস্ট বোঝানো হচ্ছে।</strong></p></figcaption></figure>

এবার আবার আমরা এজ লিস্ট এর শুরু থেকে সেইম প্রসেস শুরু করব।প্রথমে আমরা ০->২ এজকে সিলেক্ট করি। তাহলে

dis\[0]+cost(0,2) = 5 = 5

তাই ২ এর ডিস্টেন্স আপডেট হবে না।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FtR0PkBLg6zDJsZ2xL9k1%2Fimage.png?alt=media&amp;token=63c27fa7-bd3d-4623-99e6-1bd960519261" alt="" width="318"><figcaption><p><strong>বি দ্রঃ এখানে নীল রং দিয়ে Distance আর কমলা রঙ দিয়ে কস্ট বোঝানো হচ্ছে।</strong></p></figcaption></figure>

এবার ১->৩ কে সিলেক্ট করব।

dis\[1]+cost(1,3) = 7+3 = 10<12

তাই ১->৩ ডিস্টেন্স আপডেট হয়ে হবে ১০।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FIqX143zJ8e25kBJy34qw%2Fimage.png?alt=media&amp;token=4c728c6f-e4d1-4621-978e-f00ae85fd9bd" alt="" width="375"><figcaption><p><strong>বি দ্রঃ এখানে নীল রং দিয়ে Distance আর কমলা রঙ দিয়ে কস্ট বোঝানো হচ্ছে।</strong></p></figcaption></figure>

এবার ২->১ এজকে সিলেক্ট করব।

dis\[2]+cost(2,1) = 5+2 = 7 = 7

তাই ১ এর ডিস্টেন্স আপডেট হবে না।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FIqX143zJ8e25kBJy34qw%2Fimage.png?alt=media&amp;token=4c728c6f-e4d1-4621-978e-f00ae85fd9bd" alt="" width="375"><figcaption><p><strong>বি দ্রঃ এখানে নীল রং দিয়ে Distance আর কমলা রঙ দিয়ে কস্ট বোঝানো হচ্ছে।</strong></p></figcaption></figure>

এবার ০->৩ এজকে সিলেক্ট করব।

dis\[0]+cost(0,3) = 0+12 = 12>i10

তাই ৩ এর ডিস্টেন্স আপডেট হবে না।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FIqX143zJ8e25kBJy34qw%2Fimage.png?alt=media&amp;token=4c728c6f-e4d1-4621-978e-f00ae85fd9bd" alt="" width="375"><figcaption><p><strong>বি দ্রঃ এখানে নীল রং দিয়ে Distance আর কমলা রঙ দিয়ে কস্ট বোঝানো হচ্ছে।</strong></p></figcaption></figure>

এখন যদি খেয়াল করে দেখো আমরা সোর্স নোড থেকে প্রত্যেক নোড এর শর্টেস্ট ডিস্টেন্স পেয়ে গেছি।

তাহলে সোর্স ০ থেকে সব নোড এর শর্টেস্ট ডিসেটেন্সঃ

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2Ff8GmPrF5NOatLUNDPATF%2Fimage.png?alt=media&amp;token=35725ff7-bf4c-4417-b880-3dc744ff6917" alt="" width="563"><figcaption></figcaption></figure>

তবে Bellmanford এলগোরিদমে আমাদের আরো একটি ব্যাপার খেয়াল রাখতে হবে। সেটি বোঝার জন্য আমরা আরেকটি গ্রাফ দেখি।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FM0AAnRUOyS0QTKIy8Y8P%2Fimage.png?alt=media&amp;token=ef736cc3-0824-4072-ac7c-f2adcb05e5ad" alt=""><figcaption></figcaption></figure>

এখানে সোর্স ০ ধরে যদি এজ লিস্ট ধরে Bellmanford algorithm চালায় তাহলে নোড ২ কখনো রিল্যাক্স হবে না কেননা ০ থেকে ২ এ যাওয়ার ডাইরেক্ট কিংবা আনডাইরেক্ট কোনো রাস্তা নেই। তবে ২->৩ নোড এ infinite-7 \<infinte থেকে ছোট হওয়ায় ৩ নোডটি রিল্যাক্স হবে।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FGQRjlEEWokYKaherKBs2%2Fimage.png?alt=media&amp;token=e118a001-6da8-4cf5-8fef-d967b4ad060b" alt=""><figcaption></figcaption></figure>

কিন্ত এটা হওয়া উচিত নয়। কেননা ০ থেকে ৩ যাওয়ার কোনো রাস্তা নাই তাই এখানে infinite এই থাকা উচিত।

**তাই আমরা Bellmanford algorithm করার সময় এটাও খেয়াল রাখবো যে কোনো নোড রিল্যাক্স হতে চাইলে তার প্যারেন্ট নোড ইনফিনিটি কিনা। যদি হয় তাহলে রিল্যাক্স করব না অন্যথায় করব।**
