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

C++ प्रोग्राम: ग्राफ में सभी फॉरवर्ड एजेस खोजें


इस सेक्शन में, हम एक C++ प्रोग्राम पर विचार करेंगे जो ग्राफ में सभी फॉरवर्ड एजेस खोजता है।

एल्गोरिदम

टोपो फंक्शन के लिए

Begin
    फंक्शन topo() घोषित करें
        पॉइंटर v, m[][5] और i को इंटीजर डेटाटाइप का घोषित करें।
        x = new Node_Inf.
        x->n = i.
        x->S_Time = c.
        Push_Node(x) फंक्शन कॉल करें।
        v[i] = 1.
        for (int j = 0; j < 5; j++)
            if (m[i][j] == 0) तो
                continue;
            else if (m[i][j] == 1 && v[j] == 1 && !Exist_in_Stack(j)) तो
                if (x->S_Time < srch_Node(j)) तो
                    "Forward Edge is between" प्रिंट करें।
                    फॉरवर्ड एजेस के मान प्रिंट करें।
                    continue;
            else if (m[i][j] == 1 && v[j] == 0) तो
                c++;
                "Forward Edge is between" प्रिंट करें
                फॉरवर्ड एजेस के मान प्रिंट करें।
                topo(v,m,j) फंक्शन कॉल करें।
                c++.
                x = pop()
                x->L_Time = c.
                Store_Node(x) फंक्शन कॉल करें नोड्स में मान स्टोर करने के लिए।
    Return.
End.

उदाहरण

#include <iostream>
#include <conio.h>
using namespace std;

struct Node_Inf {
    int n;
    int L_Time, S_Time;
} *x = NULL, *y = NULL;

struct Node_1 {
    Node_Inf *ptn;
    Node_1 *nxt;
} *tp = NULL, *p = NULL, *npr = NULL;

struct Node_2 {
    Node_2 *lnk;
    Node_Inf *ptn1;
} *hd = NULL, *m = NULL, *n = NULL, *npr1 = NULL;

int c = 0;

void Push_Node(Node_Inf *ptr) {
    npr = new Node_1;
    npr->ptn = ptr;
    npr->nxt = NULL;
    if(tp == NULL) {
        tp = npr;
    } else {
        npr->nxt = tp;
        tp = npr;
    }
}

Node_Inf *pop() {
    if(tp == NULL) {
        cout << "underflow\n";
    } else {
        p = tp;
        tp = tp->nxt;
        return(p->ptn);
        delete(p);
    }
}

void Store_Node(Node_Inf *ptr1) {
    npr1 = new Node_2;
    npr1->ptn1 = ptr1;
    npr1->lnk = NULL;
    if(c == 0) {
        hd = npr1;
        m = hd;
        m->lnk = NULL;
        c++;
    } else {
        m = hd;
        npr1->lnk = m;
        hd = npr1;
    }
}

int srch_Node(int j) {
    Node_2 *t = hd;
    while(t != NULL) {
        if((t->ptn1)->n == j) {
            break;
        } else {
            t = t->lnk;
            continue;
        }
    }
    return (t->ptn1)->L_Time;
}

int Exist_in_Stack(int j) {
    int flag = 0;
    p = tp;
    while(p != NULL) {
        if((p->ptn)->n == j) {
            flag = 1;
            return flag;
        }
        p = p->nxt;
    }
    return flag;
}

void topo(int *v, int m[][5], int i) {
    x = new Node_Inf;
    x->n = i;
    x->S_Time = c;
    Push_Node(x);
    v[i] = 1;
    
    for(int j = 0; j < 5; j++) {
        if(m[i][j] == 0)
            continue;
        else if(m[i][j] == 1 && v[j] == 1 && !Exist_in_Stack(j)) {
            if(x->S_Time < srch_Node(j)) {
                cout << "\nForward Edge is between " << i << " and " << j << endl;
            }
            continue;
        } else if(m[i][j] == 1 && v[j] == 0) {
            c++;
            cout << "\nForward Edge is between " << i << " and " << j << endl;
            topo(v, m, j);
        }
    }
    c++;
    x = pop();
    x->L_Time = c;
    Store_Node(x);
    return;
}

int main() {
    int v[5], m[5][5];
    for(int i = 0; i < 5; i++)
        v[i] = 0;
    
    for(int i = 0; i < 5; i++) {
        cout << " Enter the values of matrix::" << i+1 << endl;
        for(int j = 0; j < 5; j++) {
            cin >> m[i][j];
        }
    }
    topo(v, m, 0);
    return 0;
}

आउटपुट

Enter the values of matrix:1
0 1 0 1 0
Enter the values of matrix:2
1 0 0 1 0
Enter the values of matrix:3
1 0 0 0 1
Enter the values of matrix:4
0 1 1 0 0
Enter the values of matrix:5
1 1 0 0 0
Forward Edge is between 0 and 1
Forward Edge is between 1 and 3
Forward Edge is between 3 and 2
Forward Edge is between 2 and 4
Forward Edge is between 0 and 3

DFS ट्रैवर्सल में फॉरवर्ड एज एक नॉन-ट्री एज है जो डीएफएस ट्री में किसी नोड को उसके वंशज से जोड़ता है। यह प्रोग्राम DFS के दौरान डिस्कवरी/फिनिश टाइम्स (S_Time, L_Time) का उपयोग करके फॉरवर्ड एजेस का पता लगाता है। एक एज (u,v) फॉरवर्ड एज है यदि v पहले से विजिटेड है (v[j]==1), स्टैक में नहीं है, और u का डिस्कवरी टाइम v के डिस्कवरी टाइम से कम है।

  1. - लैंप द्वारा रोशन सभी सेल के योग को ढूंढने के लिए C++ प्रोग्राम

    मान लीजिए हमारे पास H पंक्तियों और W कॉलम वाला एक ग्रिड है। जहां प्रत्येक वर्ग साफ या गंदा है। हम इस ग्रिड में शून्य या अधिक साफ वर्गों पर लैंप रख सकते हैं। एक लैंप चार दिशाओं में से प्रत्येक में सेल को रोशन कर सकता है - ऊपर, नीचे, बाएं, और दाएं - ग्रिड के किनारे या पहली बार गंदे वर्ग तक पहुंचने से

  1. ग्राफ में सुपर वर्टेक्स खोजने का C++ प्रोग्राम ग्राफ में सुपर वर्टेक्स खोजने का C++ प्रोग्राम

    मान लीजिए n वर्टेक्स वाला एक ग्राफ दिया गया है। वर्टेक्स 1 से n तक संख्याबद्ध हैं और edges सरणी में दी गई एज्स से जुड़े हैं। प्रत्येक वर्टेक्स का एक x मान है जो 1 से n के बीच होता है, यह values सरणी में दिया गया है। हमें ग्राफ में सुपर वर्टेक्स खोजने हैं। एक वर्टेक्स i को सुपर वर्टेक्स कहा जाता है

  1. दिए गए ग्राफ में ब्रिज एज की संख्या ज्ञात करने का C++ प्रोग्राम दिए गए ग्राफ में ब्रिज एज की संख्या ज्ञात करने का C++ प्रोग्राम

    मान लीजिए n वर्टेक्स और m एज वाला एक अनभारित, निदेश रहित ग्राफ दिया गया है। ग्राफ में एक ब्रिज एज वह एज है जिसे हटाने से ग्राफ असंबद्ध हो जाता है। हमें दिए गए ग्राफ में ऐसी एज की संख्या ज्ञात करनी है। ग्राफ में समानांतर एज या सेल्फ-लूप नहीं हैं। उदाहरण के लिए, यदि इनपुट है n = 5, m = 6, edges = {{1