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

C++ प्रोग्राम: DFS का उपयोग करके जांचें कि अनडायरेक्टेड ग्राफ ट्री है या नहीं


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

एल्गोरिदम

Begin function cyclicUtil() :    A) वर्तमान नोड को विज़िटेड मार्क करें।    B) इस वर्टेक्स से सटे सभी वर्टेक्स के लिए पुनरावृत्ति करें।    C) यदि कोई आसन्न विज़िटेड नहीं है, तो उस आसन्न के लिए पुनरावृत्ति करें।    D) यदि कोई आसन्न विज़िटेड है और वर्तमान वर्टेक्स का पैरेंट नहीं है, तो साइकिल मौजूद है। End Begin function cyclic():    A) सभी वर्टेक्स को नॉट विज़िटेड और रिकर्सन स्टैक का हिस्सा नहीं मार्क करें।    B) अलग-अलग DFS ट्री में साइकिल का पता लगाने के लिए रिकर्सिव फंक्शन cyclicUtil() को कॉल करें। End

उदाहरण

#include<iostream> #include <list> #include <limits.h> using namespace std; class G {    int n;    list<int> *adj;    bool CyclicUtil(int v, bool visited[], int par);    public:       G(int n); //कंस्ट्रक्टर       void addEd(int v, int w);       bool cyclic(); }; G::G(int n) {    this->n = n;    adj = new list<int> [n]; } void G::addEd(int v, int u)// ग्राफ में एज जोड़ने के लिए {    adj[v].push_back(u); // u को v की सूची में जोड़ें    adj[u].push_back(v);// v को u की सूची में जोड़ें } // रिकर्सिव फंक्शन visited[] का उपयोग करके वर्टेक्स v से पहुंच योग्य सबग्राफ में साइकिल का पता लगाता है: bool G::CyclicUtil(int v, bool visited[], int par) {    visited[v] = true; // वर्तमान नोड को विज़िटेड मार्क करें    // इस वर्टेक्स से सटे सभी वर्टेक्स के लिए पुनरावृत्ति करें    list<int>::iterator i;    for (i = adj[v].begin(); i != adj[v].end(); ++i) {       if (!visited[*i]) // यदि कोई आसन्न विज़िटेड नहीं है, तो उस आसन्न के लिए पुनरावृत्ति करें {          if (CyclicUtil(*i, visited, v))             return true;       }       // यदि कोई आसन्न विज़िटेड है और वर्तमान वर्टेक्स का पैरेंट नहीं है, तो साइकिल मौजूद है।          else if (*i != par)             return true;    }    return false; } // जांचें कि ग्राफ ट्री है या नहीं। bool G ::cyclic() {    bool *visited = new bool[n]; // सभी वर्टेक्स को नॉट विज़िटेड और रिकर्सन स्टैक का हिस्सा नहीं मार्क करें    for (int i = 0; i < n; i++)       visited[i] = false;       // अलग-अलग DFS ट्री में साइकिल का पता लगाने के लिए रिकर्सिव फंक्शन CyclicUtil() को कॉल करें       for (int u = 0; u < n; u++)          if (!visited[u])             if (CyclicUtil(u, visited, -1))                return true;                return false; } int main() {    G g1(4);    g1.addEd(0, 1);    g1.addEd(1, 2);    g1.cyclic() ? cout << "Undirected Graph isn't a tree\n" : cout    << "Undirected Graph is a tree\n";    return 0; }

आउटपुट

Undirected Graph is a tree
  1. C++ प्रोग्राम: BFS का उपयोग करके अनडायरेक्टेड ग्राफ की कनेक्टिविटी जांचना C++ प्रोग्राम: BFS का उपयोग करके अनडायरेक्टेड ग्राफ की कनेक्टिविटी जांचना

    ग्राफ की कनेक्टिविटी जांचने के लिए, हम किसी भी ट्रैवर्सल एल्गोरिदम का उपयोग करके सभी नोड्स को ट्रैवर्स करने का प्रयास करेंगे। ट्रैवर्सल पूरा होने के बाद, यदि कोई नोड है, जो विजिट नहीं हुआ है, तो ग्राफ कनेक्टेड नहीं है। अनडायरेक्टेड ग्राफ के लिए, हम एक नोड चुनेंगे और उससे ट्रैवर्स करेंगे। इस मामले

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

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

  1. C++ प्रोग्राम: DFS का उपयोग करके निर्देशित ग्राफ की कनेक्टिविटी जांचना C++ प्रोग्राम: DFS का उपयोग करके निर्देशित ग्राफ की कनेक्टिविटी जांचना

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