> 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/dijkstra/_-dijkstra-optimize-approach.md).

# মডিউল ৬\_৫ঃ Dijkstra Optimize Approach

আমরা এখন Dijkstra এর অপ্টিমাইজ ভারশন নিয়ে কাজ করব। খুব সামান্য পরিবর্তন এর মাধ্যমেই এটি করা সম্ভব।সেটি হচ্ছে আমরা কিউ এর পরিবর্তে priority queue  ব্যবহার করব।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FhGnzyTKRxMzo38uFHuYd%2Fgraph%20(9).png?alt=media&amp;token=7a946d31-eb69-4de9-9954-f5b75461376f" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2F1he72ib3FgZuCCzcmMVS%2FScreenshot%202024-01-28%20211459.png?alt=media&amp;token=80bc4ba8-b015-482c-bc7a-5872f4373f9e" alt=""><figcaption></figcaption></figure>

(০,০) নোডটাকে priority queue তে পুশ করব ও এমন ভাবে priority queue টা সেট করব যাতে আমাকে মিনিমাম ওয়েটেড নোডটা ফ্রন্ট এলিমেন্ট হিসেবে দেই।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FcU9o8BvVHWmYuAu8rTXl%2FScreenshot%202024-01-28%20212130.png?alt=media&amp;token=4e1338ae-3776-4e94-99a1-0bf20d11161a" alt=""><figcaption></figcaption></figure>

এবার (০,০) কে ফ্রন্ট ভ্যালু হিসেবে নিব এবং পপ করে দিব। এবার ০ এর চাইল্ড গুলোর পাথ রিলেক্স করার চেষ্টা করব আর যদি করা যায় তাহলে তাদেরকে priority queue তে পুশ করে দিব।

যেমন ০ থেকে ১ এ যেতে,

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

তাই ১ এর নতুন distance কে distance array তে আপডেট করব আর ১ কে ও তার distance কে priority queue তে পুশ করব।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FFbdsQjH1PIiq4yqzsY3Z%2FScreenshot%202024-01-28%20212634.png?alt=media&amp;token=0c08448a-da28-4de8-b9ef-9c79a97877db" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FABkzdmg7nO7u6QHlcJ4X%2FScreenshot%202024-01-28%20212659.png?alt=media&amp;token=ce6bdb4a-78d6-4a64-8273-e3d297d43df8" alt=""><figcaption></figcaption></figure>

০ থেকে ২ এও যাওয়া যায়।

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

তাই ২ এর নতুন distance কে distance array তে আপডেট করব আর ২কে ও তার distance কে কিউতে পুশ করব।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FTh9AqUggLZJ6JPNV6ZFn%2FScreenshot%202024-01-28%20212953.png?alt=media&amp;token=e355de9d-f9c1-4c79-a9e1-7daa37e1a64b" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FweLDmjpJ2PuxSWZdwLH4%2FScreenshot%202024-01-28%20222126.png?alt=media&amp;token=92cb3114-76ab-48fb-96a8-d111c1cc38be" alt=""><figcaption></figcaption></figure>

এবার priority queue এর ফ্রন্ট ভ্যালুকে নিব যেটি হচ্ছে ২ আর ২ কে পপ করে দিব।

২ থেকে ০ তে যাওয়া যায় কিন্ত সেটি অলরেডি রিল্যাক্সড তাই সেটিতে যাবো না। ২ থেকে ১ এ যাওয়া যায় সেই ক্ষেত্রে,

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

তাই ১ রিল্যাক্স হবে ও এর ভ্যালু distance array এবং priority queue তে আপডেট হবে।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FMXU0PeudZBdgzkE20Nic%2FScreenshot%202024-01-28%20222719.png?alt=media&amp;token=652a67c0-1f67-4ffe-9c59-b052a94298f4" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FsDZAfUGt2eWmdvt7bmoW%2FScreenshot%202024-01-28%20222727.png?alt=media&amp;token=56748154-babd-4181-b7cf-8b17c1cd2922" alt=""><figcaption></figcaption></figure>

২ থেকে ৩ এ যাওয়া যায় সেই ক্ষেত্রে,

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

তাই ৩ রিল্যাক্স হবে ও এর ভ্যালু distance array এবং priority queue তে আপডেট হবে।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FNdGT0LwWerqDXdoqX8jf%2FScreenshot%202024-01-28%20223031.png?alt=media&amp;token=f7f08c85-3ca7-4519-b19a-99e4a9aaaa06" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FEUfTdBx6zlgFDhWirIcm%2FScreenshot%202024-01-28%20223110.png?alt=media&amp;token=b4fa10ac-5181-4ad3-a97e-16c61e0d34d7" alt=""><figcaption></figcaption></figure>

এবার priority queue এর ফ্রন্ট ভ্যালুকে নিব যেটি হচ্ছে ১ আর ১ কে পপ করে দিব।

১ থেকে ০ তে যাওয়া যায় কিন্ত সেটি অলরেডি রিল্যাক্সড তাই সেটিতে যাবো না। ১ থেকে ২ এও যাওয়া যায় কিন্ত সেটিও অলরেডি রিল্যাক্সড তাই এটিও আপডেট হবে না। ১ থেকে ৩ এও যাওয়া যায় তবে সেটিও রিল্যাক্স হবে না কেননা,

dis\[1]+cost(1,3) = 5+7 = 12>5

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FNdGT0LwWerqDXdoqX8jf%2FScreenshot%202024-01-28%20223031.png?alt=media&amp;token=f7f08c85-3ca7-4519-b19a-99e4a9aaaa06" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FbZMgD4nSKMkigSdfLvCm%2FScreenshot%202024-01-28%20223531.png?alt=media&amp;token=9777c7b1-b2ce-4e04-b37e-d025b6ca0bf9" alt=""><figcaption></figcaption></figure>

এবার priority queue এর ফ্রন্ট ভ্যালুকে নিব যেটি হচ্ছে ১ আর ১ কে পপ করে দিব। কিন্ত চিন্তা করে দেখো ১ এর অলরেডি কম কস্ট এর ভ্যালু নিয়ে আমরা কাজ করে ফেলেছি তাই আমরা এখানেও কোনো আপডেট করব না।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FNdGT0LwWerqDXdoqX8jf%2FScreenshot%202024-01-28%20223031.png?alt=media&amp;token=f7f08c85-3ca7-4519-b19a-99e4a9aaaa06" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FchYTgd3G337yXJiGtdnz%2FScreenshot%202024-01-28%20223730.png?alt=media&amp;token=f66ffd70-1252-412a-895a-4f90654fd47e" alt=""><figcaption></figcaption></figure>

এবার priority queue এর ফ্রন্ট ভ্যালুকে নিব যেটি হচ্ছে ৩ আর ৩ কে পপ করে দিব।

৩ থেকে ২ আর ১ এ যাওয়া যায় তবে ২ আর ১ অলরেডি রিল্যাক্সড হওয়ার এখন আর কোনো আপডেট হবে না।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FzjdJQWvcFA41p6iyYVqR%2FScreenshot%202024-01-28%20224041.png?alt=media&amp;token=6312a45e-6afd-4998-8165-baf27ed8d5b2" alt=""><figcaption></figcaption></figure>

এবার যেহেতু priority queue এম্পটি হয়ে গেছে আমরা বলতে পারি আমাদের কাজ শেষ । এখন যদি distance array এর দিকে তাকায় তাহলে আমরা সোর্স থেকে সকল নোড এর শর্টেস্ট ডিস্টেন্স পেয়ে যাবো।

<figure><img src="https://1548341763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjliRFwU9cGQFGljHYgOZ%2Fuploads%2FNdGT0LwWerqDXdoqX8jf%2FScreenshot%202024-01-28%20223031.png?alt=media&amp;token=f7f08c85-3ca7-4519-b19a-99e4a9aaaa06" alt=""><figcaption></figcaption></figure>
