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

C++-এ STL ব্যবহার করে BFS (কম্পিটিটিভ কোডিং için)


ব্রেডথ ফার্স্ট সার্চ (BFS) ট্রাভার্সাল একটি অ্যালগরিদম যা একটি দেওয়া গ্রাফের সব নোড ভিজিট করতে ব্যবহৃত হয়। এই ট্রাভার্সাল অ্যালগরিদমে একটি নোড সিলেক্ট করা হয় এবং তারপর সব এডজেসেন্ট নোড একে পর একে ভিজিট করা হয়। সব এডজেসেন্ট ভার্টেক্স সম্পন্ন হলে, এটি আরেকটি ভার্টেক্স চেক করতে आगे বড়ে এবং সেটির এডজেসেন্ট ভার্টেক্সগুলো আবার চেক করে।

C++-এ STL ব্যবহার করে BFS (কম্পিটিটিভ কোডিং için)

কম্পিটিটিভ কোডিং-এ, আমাদের সমস্যা খুব দ্রুত সমাধান করতে হয়। আমরা STL (C++-এর স্ট্যান্ডার্ড লাইব্রেরি) ব্যবহার করে এই অ্যালগরিদম বাস্তবায়ন করব, এর জন্য কিউ ডেটা স্ট্রাকচার ব্যবহার করতে হবে। সব এডজেসেন্ট ভার্টেক্স কিউতে যোগ করা হয়, যখন সব এডজেসেন্ট ভার্টেক্স সম্পন্ন হয়, কিউ থেকে একটি আইটেম রিমুভ করা হয় এবং সেই ভার্টেক্স থেকে আবার ট্রাভার্সাল শুরু হয়।

গ্রাফে কখনো কখনো সাইকেল পাওয়া যায়, তাই আমরা একটি অ্যারে ব্যবহার করব নোডটি ইতিমধ্যে ভিজিটেড কিনা চেক করার জন্য।

ইনপুট: গ্রাফের এডজেসেন্সি ম্যাট্রিক্স। A B C D E F
A 0 1 1 1 0 0
B 1 0 0 1 1 0
C 1 0 0 1 0 1
D 1 1 1 0 1 1
E 0 1 0 1 0 1
F 0 0 1 1 1 0
আউটপুট: BFS Traversal: B A D E C F

অ্যালগরিদম

bfs(vertices, start)

ইনপুট - ভার্টেক্সের লিস্ট, এবং শুরু করার ভার্টেক্স।

আউটপুট - যদি গ্রাফ কানেক্টেড থাকে তবে সব নোড ট্রাভার্স করা।

Begin
    define an empty queue que
    at first mark all nodes status as unvisited
    add the start vertex into the que
    while que is not empty, do
        delete item from que and set to u
        display the vertex u
        for all vertices 1 adjacent with u, do
            if vertices[i] is unvisited, then
                mark vertices[i] as temporarily visited
                add v into the queue
            end if
        done
        mark u as completely visited
    done
End

উদাহরণ

#include<iostream>
#include<queue>
#define NODE 6
using namespace std;
class node {
    public:
        int val;
        int state; // স্ট্যাটাস
};
int graph[NODE][NODE] = {
    {0, 1, 1, 1, 0, 0},
    {1, 0, 0, 1, 1, 0},
    {1, 0, 0, 1, 0, 1},
    {1, 1, 1, 0, 1, 1},
    {0, 1, 0, 1, 0, 1},
    {0, 0, 1, 1, 1, 0}
};
void bfs(node *vert, node s) {
    node u;
    int i, j;
    queue<node> que;
    for(i = 0; i < NODE; i++) {
        vert[i].state = 0; // নন-ভিজিটেড
    }
    vert[s.val].state = 1; // ভিজিটেড
    que.push(s); // স্টার্টিং নোড ইনসার্ট
    while(!que.empty()) {
        u = que.front(); // কিউ থেকে ডিলিট এবং প্রিন্ট
        que.pop();
        cout << char(u.val+'A') << " ";
        for(i = 0; i < NODE; i++) {
            if(graph[i][u.val]) {
                // যখন নোড নন-ভিজিটেড
                if(vert[i].state == 0) {
                    vert[i].state = 1;
                    que.push(vert[i]);
                }
            }
        }
        u.state = 2; // নোড u জন্য কমপ্লিটেড
    }
}
int main() {
    node vertices[NODE];
    node start;
    char s;
    for(int i = 0; i < NODE; i++) {
        vertices[i].val = i;
    }
    s = 'B'; // স্টার্টিং ভার্টেক্স B
    start.val = s-'A';
    cout << "BFS Traversal: ";
    bfs(vertices, start);
    cout << endl;
}

আউটপুট

BFS Traversal: B A D E C F

  1. সি++ STL ব্যবহার করে অ্যারে প্যালিনড্রোম কিনা তা যাচাই করার প্রোগ্রাম

  2. C++ STL-এ স্ট্যাক (Stack)

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

  4. প্রতিযোগিতামূলক কোডিং-এর জন্য পাইথন ট্রিকস