এখন আমরা Dijkstra এলগোরিদম এর অপ্টিমাইজ ভার্সন এর কোডটা ইমপ্লিমেন্ট করব।
// Some code```cppint n, e; cin >> n >> e;while (e--) {int a, b, c; cin >> a >> b >> c;v[a].push_back({b, c});v[b].push_back({a, c}); }for (int i =0; i < n; i++) {dis[i] = INT_MAX; }dijkstra(0);```
এখানে সব আগের ভার্শন এর মতোই।
// Some code```cppclasscmp{public:booloperator()(pair<int,int> a,pair<int,int> b) {returna.second >b.second; }};```
// Some code```cpp priority_queue<pair<int,int>, vector<pair<int,int>>, cmp> pq;pq.push({src,0});```
এখন আমরা প্রাইওরিটি কিউ এর মাধ্যমে নোড গুলোর ট্র্যাক রাখব ও যাতে সেই কিউ আমাদের সব সময় ছোট কস্ট এর নোড ফ্রন্ট হিসেবে দেয় তাই একটি কাস্টম কম্পেয়ার ক্লাস লিখলাম।
এখানে আমরা priority queue এম্পটি না হওয়া অব্দি লুপ চালাবো আর টপ ভ্যালুকে নিব। এবং পপ করে দিব। সেই নোড এর প্রত্যেক চাইল্ড এর কাছে যাবো আর যদি তাদেরকে রিল্যাক্স করা পসিবল হয় তাহলে তাদের রিল্যাক্স করে priority queue তে পুশ করে দিব।
সম্পূর্ণ কোডঃ
// Some code```cpp#include<bits/stdc++.h>usingnamespace std;constint N =100;vector<pair<int,int>>v[N];intdis[N];classcmp{public:booloperator()(pair<int,int> a,pair<int,int> b) {returna.second >b.second; }};voiddijkstra(int src){ priority_queue<pair<int,int>, vector<pair<int,int>>, cmp> pq;pq.push({src,0});dis[src] =0;while (!pq.empty()) { pair<int,int> parent =pq.top();pq.pop();int node =parent.first;int cost =parent.second;for (pair<int,int> child :v[node]) {int childNode =child.first;int childCost =child.second;if (cost + childCost <dis[childNode]) { // path relaxdis[childNode] = cost + childCost;pq.push({childNode,dis[childNode]}); } } }}intmain(){int n, e; cin >> n >> e;while (e--) {int a, b, c; cin >> a >> b >> c;v[a].push_back({b, c});v[b].push_back({a, c}); }for (int i =0; i < n; i++) {dis[i] = INT_MAX; }dijkstra(0);for (int i =0; i < n; i++) { cout << i <<"-> "<<dis[i] << endl; }return0;}```