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

C++ प्रोग्राम: दिए गए साइक्लिक ग्राफ में एज को हटाना ताकि उसका लीनियर एक्सटेंशन पाया जा सके


इस प्रोग्राम में हम मूल रूप से एक फीडबैक आर्क सेट ढूंढते हैं जिसमें वे एज होते हैं जिन्हें ग्राफ से हटाने पर, ग्राफ डायरेक्टेड एसाइक्लिक ग्राफ बन जाता है।

एल्गोरिदम

Begin    function checkCG(int n) :    n: वर्टेक्स की संख्या।    arr: स्ट्रक्चर ग्राफ वेरिएबल।    cnt = 0 और size = (n-1) इनिशियलाइज़ करें।    For i = 0 to n-1       if (cnt == size)          return 0       if (arr[i].ptr == NULL)          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       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                arr[j].ptr = (arr[j].ptr)->next             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; } array[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++ प्रोग्राम दिए गए ग्राफ में ब्रिज एज की संख्या ज्ञात करने का C++ प्रोग्राम

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

  1. ग्राफ से घटाए जा सकने वाले अधिकतम स्कोर की मात्रा ज्ञात करने का C++ प्रोग्राम ग्राफ से घटाए जा सकने वाले अधिकतम स्कोर की मात्रा ज्ञात करने का C++ प्रोग्राम

    मान लीजिए n वर्टेक्स और m एज वाला एक भारित, निदेश रहित ग्राफ दिया गया है। ग्राफ का स्कोर ग्राफ में सभी एज भारों का योग है। एज भार ऋणात्मक हो सकते हैं, और यदि उन्हें हटा दिया जाए तो ग्राफ का स्कोर बढ़ जाता है। हमें ग्राफ को संबद्ध रखते हुए एज हटाकर ग्राफ के स्कोर को न्यूनतम करना है। हमें घटाए जा सकन

  1. C++ में जांचें कि दिया गया ट्री ग्राफ रैखिक है या नहीं C++ में जांचें कि दिया गया ट्री ग्राफ रैखिक है या नहीं

    यहां हम देखेंगे कि ट्री ग्राफ रैखिक है या नहीं, इसकी जांच कैसे करें। एक रैखिक ट्री ग्राफ को एक ही पंक्ति में व्यक्त किया जा सकता है। मान लीजिए यह एक रैखिक ट्री ग्राफ का उदाहरण है।लेकिन यह रैखिक नहीं है -किसी ग्राफ की जांच करने के लिए कि वह रैखिक है या नहीं, हम दो शर्तों का पालन कर सकते हैं:यदि नोड्स