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

সি++ প্রোগ্রাম: গ্রাফে ভালো ফিডব্যাক এজ সেট (Good Feedback Edge Set) বের করা


এই প্রোগ্রামে আমরা মূলত একটি ফিডব্যাক আর্ক সেট (feedback arc set) বের করব যাতে এজগুলো যদি গ্রাফ থেকে রিমুভ করা হয়, তবে গ্রাফটি ডিরেক্টেড অ্যাসাইক্লিক গ্রাফ (DAG) হয়ে যায়।

আলগরিদম

Begin function checkCG(int n) : n: количество вершин. arr: struct graph переменная.
Initialize cnt = 0 and size = (n-1).
For i = 0 to n-1
    if (cnt == size) return 0
    if (arr[i].ptr == NULL)
        Increase cnt.
        for j = 0 to n-1
            while (arr[j].ptr != NULL)
                if ((arr[j].ptr)->des == (arr[i].ptr)->des)
                    (arr[j].ptr)->des = -1
                arr[i].ptr = (arr[i].ptr)->next
            Done
        Done
    Done
Done
initialize visited[n + 1]
For i = 0 to n-1
    while (arr[i].ptr != NULL)
        Print (arr[i].ptr)->des
        visited[i] = 1
        for j = 0 to n-1
            while (arr[j].ptr != NULL)
                print (arr[j].ptr)->des
                if (visited[arr[j].v] == 1)
                    print arr[i].v << " - " << arr[j].v
                Done
            Done
        arr[i].ptr = (arr[i].ptr)->next
    Done
Done
return 1
End

উদাহরণ

#include <iostream>
using namespace std;

int c = 0;
struct ad_list {
    int des;
    ad_list *next;
} *np = NULL, *np1 = NULL, *p = NULL, *q = NULL;

struct Graph {
    int v;
    ad_list *ptr;
} arr[6];

void addRevEdge(int sr, int des) {
    np1 = new ad_list;
    np1->des = sr;
    np1->next = NULL;
    if (arr[des].ptr == NULL) {
        arr[des].ptr = np1;
        q = arr[des].ptr;
        q->next = NULL;
    } else {
        q = arr[des].ptr;
        while (q->next != NULL) q = q->next;
        q->next = np1;
    }
}

void addEd(int sr, int des) {
    np = new ad_list;
    np->des = des;
    np->next = NULL;
    if (arr[sr].ptr == NULL) {
        arr[sr].ptr = np;
        p = arr[sr].ptr;
        p->next = NULL;
    } else {
        p = arr[sr].ptr;
        while (p->next != NULL) p = p->next;
        p->next = np;
    }
}

void print_graph(int n) {
    for (int i = 0; i < n; i++) {
        cout << "Adjacency List of " << arr[i].v << ": ";
        while (arr[i].ptr != NULL) {
            cout << (arr[i].ptr)->des << " ";
            arr[i].ptr = (arr[i].ptr)->next;
        }
        cout << endl;
    }
}

int checkCG(int n) {
    int cnt = 0;
    int size = n - 1;
    for (int i = 0; i < n; i++) {
        if (cnt == size) return 0;
        if (arr[i].ptr == NULL) {
            cnt++;
            for (int j = 0; j < n; j++) {
                while (arr[j].ptr != NULL) {
                    if ((arr[j].ptr)->des == (arr[i].ptr)->des) {
                        (arr[j].ptr)->des = -1;
                    }
                    arr[i].ptr = (arr[i].ptr)->next;
                }
            }
        }
    }
    cout << "after checking dag";
    int visited[n + 1];
    for (int i = 0; i < n; i++) {
        while (arr[i].ptr != NULL) {
            cout << (arr[i].ptr)->des << " ";
            visited[i] = 1;
            for (int j = 0; j < n; j++) {
                while (arr[j].ptr != NULL) {
                    cout << (arr[j].ptr)->des << " ";
                    if (visited[arr[j].v] == 1) {
                        cout << arr[i].v << " - " << arr[j].v;
                    }
                    arr[j].ptr = (arr[j].ptr)->next;
                }
                cout << endl;
            }
            arr[i].ptr = (arr[i].ptr)->next;
        }
        cout << endl;
    }
    return 1;
}

int main() {
    int n = 5;
    cout << "Number of vertices: " << n << endl;
    for (int i = 0; i < n; i++) {
        arr[i].v = i;
        arr[i].ptr = NULL;
    }
    addEd(1, 2);
    addEd(2, 1);
    addEd(0, 1);
    addEd(2, 3);
    addEd(2, 0);
    addEd(5, 4);
    addEd(4, 2);
    print_graph(n);
    cout << "Feedback arc Set: ";
    if (checkCG(n) == 0)
        cout << " None";
}

আউটপুট

Number of vertices: 5
Adjacency List of 0: 1
Adjacency List of 1: 2
Adjacency List of 2: 1 3 0
Adjacency List of 3: 
Adjacency List of 4: 2
Feedback arc Set: None
  1. C++ প্রোগ্রাম: পারফেক্ট অ্যারে বানানো (সাবঅ্যারে গুড হলে)

  2. C++ প্রোগ্রাম: গ্রাফে সুপার ভেরটেক্স চিহ্নিতকরণ

  3. C++-এ প্যারিটি (Parity) বের করার প্রোগ্রাম

  4. C++ প্রোগ্রাম: গ্রাফের এজ কভার ক্যালকুলেট করা