কম্পিউটার টিউটোরিয়াল

সি প্রোগ্রামে ০-১ বিএফএস (বাইনারি ওয়েট গ্রাফে শর্টেস্ট পাথ)


ধরুন একটি গ্রাফ আছে কিছু নোড এবং সংযুক্ত এজ সহ। প্রতিটি এজের বাইনারি ওয়েট আছে। অর্থাৎ ওয়েট হবে ০ বা ১। একটি সোর্স ভার্টেক্স দেওয়া আছে। আমাদের সোর্স থেকে অন্য সব ভার্টেক্স পর্যন্ত শর্টেস্ট পাথ বের করতে হবে। ধরুন গ্রাফটি নিচের মতো −

সি প্রোগ্রামে ০-১ বিএফএস (বাইনারি ওয়েট গ্রাফে শর্টেস্ট পাথ)

সাধারণ বিএফএস এলগরিদমে সব এজের ওয়েট সমান। এখানে কিছু ০ এবং কিছু ১। প্রতিটি ধাপে আমরা অপ্টিমাল ডিস্ট্যান্স কন্ডিশন চেক করব। এখানে ডবল-এন্ডেড কিউ (deque) ব্যবহার করে নোড স্টোর করব। এজের ওয়েট চেক করব। যদি ০ হয়, তবে কিউয়ের ফ্রন্টে পুশ করব, অন্যথায় ব্যাকে। বিস্তারিত জানতে অ্যালগরিদম দেখুন।

অ্যালগরিদম

binaryBFS(src) −

শুরু    dist অ্যারে ডিক্লেয়ার করুন যেটি সোর্স থেকে ভার্টেক্স i-এর দূরত্ব dist[i]-তে স্টোর করবে। প্রাথমিকভাবে ইনফিনিটি দিয়ে ফিল করুন    dist[src] := 0    src কিউ Q-তে ইনসার্ট করুন    v := Q-র প্রথম এলিমেন্ট, এবং কিউ থেকে ডিলিট করুন    while Q খালি নয়, do       v-এর সব সংযুক্ত এজ e এর জন্য, do          if v থেকে i-এর ওয়েট > dist[v] + v থেকে i-এর ওয়েট, then ওয়েট আপডেট করুন             যদি ওয়েট ০ হয়, তবে ফ্রন্টে স্টোর করুন, অন্যথায় ব্যাকে          end if       done    done    dist অ্যার থেকে সব দূরত্ব প্রিন্ট করুন শেষ

উদাহরণ

#include<iostream> #include<vector> #include<deque> #define V 8 using namespace std; struct node {    int next, weight; }; vector <node> edges[V]; void binaryBFS(int src) {    int dist[V];    for (int i=0; i<V; i++) // প্রাথমিকভাবে ইনফিনিটি       dist[i] = INT_MAX;    deque <int> Q;    dist[src] = 0; // সোর্স থেকে সোর্সের দূরত্ব ০    Q.push_back(src);    while (!Q.empty()) {       int v = Q.front(); // প্রথম ভার্টেক্স ডিলিট করে v-তে স্টোর       Q.pop_front();       for (int i=0; i<edges[v].size(); i++) {          // অপ্টিমাল ডিস্ট্যান্স চেক          if (dist[edges[v][i].next] > dist[v] + edges[v][i].weight) {             dist[edges[v][i].next] = dist[v] + edges[v][i].weight;             if (edges[v][i].weight == 0) // ০ ওয়েট এজ ফ্রন্টে, অন্যথায় ব্যাকে                Q.push_front(edges[v][i].next);             else                Q.push_back(edges[v][i].next);          }       }    }    for (int i=0; i<V; i++)       cout << dist[i] << " "; } void addEdge(int u, int v, int wt) {    edges[u].push_back({v, wt});    edges[v].push_back({u, wt}); } int main() {    addEdge(0, 1, 0);    addEdge(0, 3, 1);    addEdge(0, 4, 0);    addEdge(1, 2, 1);    addEdge(1, 7, 0);    addEdge(2, 5, 1);    addEdge(2, 7, 0);    addEdge(3, 4, 0);    addEdge(3, 6, 1);    addEdge(4, 6, 1);    addEdge(5, 7, 1);    addEdge(6, 7, 1);    int src = 6;    binaryBFS(src); }

আউটপুট

1 1 1 1 1 2 0 1

  1. জাভাস্ক্রিপ্টে শর্টেস্ট পাথ অ্যালগরিদম

  2. ডায়রেক্টেড অসাইক্লিক গ্রাফে শর্টেস্ট পাথ (Shortest Path in a DAG)

  3. ঠিক k সংখ্যক এজ দিয়ে শর্টেস্ট পাথ (Shortest path with exactly k Edges)

  4. C++-এ ডিসকানেক্টেড গ্রাফের জন্য BFS