Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में जांचें कि ग्राफ DAG है या नहीं

एक डायरेक्टेड एसाइक्लिक ग्राफ (DAG) एक ग्राफ है जो डायरेक्टेड है और बिना उन साइकिल के जो अन्य एज को जोड़ते हैं। इस ग्राफ के एज एक ही दिशा में जाते हैं। यह जांचने के लिए एक C++ प्रोग्राम है कि ग्राफ DAG है या नहीं।

एल्गोरिदम

Begin
    Function checkDAG(int n):
        count = 0 इनिशियलाइज़ करें
        size = n - 1 इनिशियलाइज़ करें
        i = 0 से n-1 तक
            if (count == size)
                return 1
            done
            if (arr[i].ptr == NULL)
                count बढ़ाएं
                j = 0 से n-1 तक
                    while (arr[j].ptr != NULL)
                        if ((arr[j].ptr)->d == (arr[i].ptr)->d)
                            (arr[j].ptr)->d = -1
                        done
                    arr[i].ptr = (arr[i].ptr)->next
                    done
                done
            done
        done
        return 0
End

उदाहरण कोड

#include <iostream>
using namespace std;

int c = 0;

struct ad_list {
    int d;
    ad_list *next;
} *np = NULL, *np1 = NULL, *p = NULL, *q = NULL;

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

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

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

void print_g(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)->d << " ";
            arr[i].ptr = (arr[i].ptr)->next;
        }
        cout << endl;
    }
}

int checkDAG(int n) {
    int count = 0;
    int size = n - 1;
    for (int i = 0; i < n; i++) {
        if (count == size) {
            return 1;
        }
        if (arr[i].ptr == NULL) {
            count++;
            for (int j = 0; j < n; j++) {
                while (arr[j].ptr != NULL) {
                    if ((arr[j].ptr)->d == (arr[i].ptr)->d) {
                        (arr[j].ptr)->d = -1;
                    }
                    arr[i].ptr = (arr[i].ptr)->next;
                }
            }
        }
    }
    return 0;
}

int main() {
    int v = 4;
    cout << "Number of vertices: " << v << endl;
    for (int i = 0; i < v; i++) {
        arr[i].v = i;
        arr[i].ptr = NULL;
    }
    addEdge(1, 0);
    addEdge(3, 1);
    addEdge(2, 1);
    addEdge(0, 3);
    addEdge(4, 1);
    print_g(v);
    cout << "The given graph is 'Directed Acyclic Graph' :";
    if (checkDAG(v) == 1)
        cout << " yes";
    else
        cout << " no";
    return 0;
}

आउटपुट

Number of vertices: 4
Adjacency List of 0: 3
Adjacency List of 1: 0
Adjacency List of 2: 1
Adjacency List of 3: 1
The given graph is 'Directed Acyclic Graph' : yes
  1. C++ प्रोग्राम: जांचें कि अनिर्देशित ग्राफ में यूलरियन साइकिल है या नहीं C++ प्रोग्राम: जांचें कि अनिर्देशित ग्राफ में यूलरियन साइकिल है या नहीं

    यूलर सर्किट के बारे में जानने के लिए, हमें यूलर पथ के बारे में पता होना चाहिए। यूलर पथ एक ऐसा पथ है जिसके द्वारा हम प्रत्येक नोड को ठीक एक बार विजिट कर सकते हैं। हम समान एज का उपयोग कई बार कर सकते हैं। यूलर सर्किट यूलर पथ का एक विशेष प्रकार है। जब यूलर पथ का प्रारंभिक वर्टेक्स उस पथ के अंतिम वर्टेक

  1. C++ प्रोग्राम: जांचें कि क्या एक निर्देशित ग्राफ में यूलरियन चक्र है C++ प्रोग्राम: जांचें कि क्या एक निर्देशित ग्राफ में यूलरियन चक्र है

    यूलर चक्र/सर्किट एक पथ है; जिसके द्वारा हम प्रत्येक एज को ठीक एक बार देख सकते हैं। हम एक ही वर्टेक्स का कई बार उपयोग कर सकते हैं। यूलर सर्किट यूलर पथ का एक विशेष प्रकार है। जब यूलर पथ का प्रारंभिक वर्टेक्स उस पथ के अंतिम वर्टेक्स से भी जुड़ा होता है, तो इसे यूलर सर्किट कहा जाता है। यह जांचने के लि

  1. C++ प्रोग्राम: जांचें कि क्या एक ग्राफ दृढ़ता से जुड़ा हुआ है या नहीं C++ प्रोग्राम: जांचें कि क्या एक ग्राफ दृढ़ता से जुड़ा हुआ है या नहीं

    निर्देशित ग्राफ में घटकों को दृढ़ता से जुड़ा हुआ कहा जाता है, जब एक घटक में वर्टेक्स के प्रत्येक जोड़े के बीच एक पथ होता है। इस एल्गोरिदम को हल करने के लिए, पहले, प्रत्येक वर्टेक्स का फिनिश टाइम प्राप्त करने के लिए DFS एल्गोरिदम का उपयोग किया जाता है, अब ट्रांसपोज़्ड ग्राफ का फिनिश टाइम ढूंढें, फि