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

C++-এ টপোলজিক্যাল সোর্টিং (Topological Sorting) দিয়ে গ্রাফে সাইকেল (Cycle) চেক করা


একটি ডায়রেক্টেড্যাসাইক্লিক গ্রাফ (Directed Acyclic Graph - DAG) এর ভার্টেক্সগুলো টপোলজিক্যাল সোর্ট (Topological Sort) ব্যবহার করে লিনিয়ার অর্ডারে সর্ট করা যায়।

টপোলজিক্যাল সোর্ট শুধু DAG-এ কাজ করে। একটি DAG-এ একাধিক টপোলজিক্যাল সোর্ট থাকতে পারে।

নিচের C++ প্রোগ্রামে আমরা টপোলজিক্যাল সোর্ট করব এবং গ্রাফে সাইকেল (cycle) আছে কিনা তা চেক করব।

এলগরিদম

Topo_Sort ফাংশনের জন্য

Begin
    Function Topo_Sort() ডিফাইন
    x ইন্টিজার, vstd[] বুলিয়ান অ্যারে এবং Stack স্ট্যাক ডিক্লেয়ার করে প্যারামিটার হিসেবে পাস করুন।
    vstd[x] = true সেট করে করেন্ট নোড ভিজিটেড (visited) মার্ক করুন।
    ইটারেটর i ডিক্লেয়ার করুন।
    for (i = a[x].begin(); i != a[x].end(); ++i)
        if (!vstd[*i]) Topo_Sort(*i, vstd, Stack) কল করুন।
    push() কল করে স্টকে ভ্যালু ইনসার্ট করুন।
End.

উদাহরণ

#include <iostream>
#include <list>
#include <stack>
using namespace std;

class grph { // গ্রাফ রিপ্রেজেন্ট করার ক্লাস
    int ver;
    list *a; // অ্যাডজেসেন্সি লিস্ট ধারণ করার অ্যারে পয়েন্টার
    void Topo_Sort(int x, bool vstd[], stack &Stack); // Topol_Sort দ্বারা ব্যবহৃত হেল্পার ফাংশন
public:
    grph(int ver); // কনস্ট্রাক্টর
    void Insert_Edge(int x, int y); // গ্রাফে এজ ইনসার্ট
    void Topol_Sort(); // পুরো গ্রাফের টপোলজিক্যাল সোর্ট প্রিন্ট
};

grph::grph(int ver) {
    this->ver = ver;
    a = new list[ver];
}

void grph::Insert_Edge(int x, int y) {
    a[x].push_back(y); // x-এর লিস্টে y যোগ
}

// Topol_Sort দ্বারা ব্যবহৃত রিকারসিভ ফাংশন
void grph::Topo_Sort(int x, bool vstd[], stack &Stack) {
    vstd[x] = true; // করেন্ট নোড ভিজিটেড মার্ক
    list::iterator i;
    for (i = a[x].begin(); i != a[x].end(); ++i)
        if (!vstd[*i])
            Topo_Sort(*i, vstd, Stack);
    // রেজাল্ট স্টোর করার স্টকে করেন্ট ভার্টেক্স পুশ
    Stack.push(x);
}

void grph::Topol_Sort() {
    stack Stack;
    // সব ভার্টেক্স আনভিজিটেড হিসেবে মার্ক
    bool *vstd = new bool[ver];
    for (int i = 0; i < ver; i++) vstd[i] = false;
    for (int i = 0; i < ver; i++)
        if (vstd[i] == false)
            Topo_Sort(i, vstd, Stack);
    while (Stack.empty() == false) {
        cout << Stack.top() << " ";
        Stack.pop();
    }
}

int main() {
    grph g(6); // উপরের ডায়াগ্রাম অনুযায়ী গ্রাফ তৈরি
    g.Insert_Edge(5, 2);
    g.Insert_Edge(5, 0);
    g.Insert_Edge(4, 0);
    g.Insert_Edge(4, 1);
    g.Insert_Edge(2, 3);
    g.Insert_Edge(3, 1);
    cout << "Topological Sort of the graph is: \n";
    g.Topol_Sort();
    return 0;
}

আউটপুট

Topological Sort of the graph is:
5 4 2 3 1 0
  1. C++ প্রোগ্রাম: আনডায়রেক্টেড গ্রাফে অয়লার পাথ আছে কিনা চেক করা

  2. C++ প্রোগ্রাম: আনডায়রেক্টেড গ্রাফে অয়লার সার্কিট আছে কিনা চেক করা

  3. C++ প্রোগ্রাম: নির্দেশিত গ্রাফে অয়লার চক্র আছে কিনা যাচাই

  4. C++ প্রোগ্রাম: গ্রাফ স্ট্রংলি কানেক্টেড কিনা যাচাই