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

C++ प्रोग्राम: जांचें कि निर्देशित ग्राफ (Directed Graph) में यूलरियन पथ है या नहीं


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

यह जांचने के लिए कि एक निर्देशित ग्राफ में यूलर पथ है या नहीं, हमें इन शर्तों की जांच करनी होगी:

  • एक एकल वर्टेक्स aₙ होना चाहिए जहां (इन-डिग्री + 1 = आउट-डिग्री)
  • एक एकल वर्टेक्स bₙ होना चाहिए जहां (इन-डिग्री = आउट-डिग्री + 1)
  • बाकी सभी वर्टेक्स में (इन-डिग्री = आउट-डिग्री) होना चाहिए। यदि इनमें से कोई भी मामला विफल होता है, तो ग्राफ में कोई यूलर पथ नहीं है।

इनपुट

ग्राफ का आसन्नता मैट्रिक्स (Adjacency Matrix):

00110
10100
00010
01001
10000

आउटपुट

यूलर पथ मिला।

एल्गोरिदम

traverse(u, visited)

इनपुट: प्रारंभ नोड u और विजिटेड नोड सरणी
आउटपुट: सभी कनेक्टेड वर्टेक्स ट्रैवर्स करें

Begin
    u को विजिटेड मार्क करें
    सभी वर्टेक्स v के लिए, यदि u के साथ आसन्न है, तो:
        यदि v विजिटेड नहीं है, तो
            traverse(v, visited)
    किया
End

isConnected(graph)

इनपुट: ग्राफ
आउटपुट: ग्राफ कनेक्टेड है तो True

Begin
    विजिटेड सरणी परिभाषित करें
    ग्राफ में सभी वर्टेक्स u के लिए:
        सभी नोड्स को अनविजिटेड बनाएं
        traverse(u, visited)
        यदि कोई अनविजिटेड नोड शेष है, तो
            false लौटाएं
    किया
    true लौटाएं
End

hasEulerPath(Graph)

इनपुट: दिया गया ग्राफ
आउटपुट: यूलर सर्किट मिलने पर True

Begin
    an := 0, bn := 0
    यदि isConnected() गलत है, तो false लौटाएं
    प्रत्येक नोड के लिए इनवर्ड और आउटवर्ड एज काउंट की सूची परिभाषित करें
    ग्राफ में सभी वर्टेक्स i के लिए:
        sum := 0
        i से जुड़े सभी वर्टेक्स j के लिए:
            वर्टेक्स i के लिए इनवर्ड एज बढ़ाएं
            sum बढ़ाएं
        किया
        वर्टेक्स i के आउटवर्ड एज की संख्या sum है
    किया
    
    यदि इनवर्ड सूची और आउटवर्ड सूची समान हैं, तो true लौटाएं (यूलर सर्किट)
    
    ग्राफ में सभी वर्टेक्स i के लिए:
        यदि inward[i] ≠ outward[i], तो:
            यदि inward[i] + 1 = outward[i], तो an++
            अन्यथा यदि inward[i] = outward[i] + 1, तो bn++
    किया
    
    यदि an और bn दोनों 1 हैं, तो true लौटाएं
    अन्यथा false लौटाएं
End

उदाहरण कोड

#include <iostream>
#include <vector>
#define NODE 5
using namespace std;

int graph[NODE][NODE] = {
    {0, 0, 1, 1, 0},
    {1, 0, 1, 0, 0},
    {0, 0, 0, 1, 0},
    {0, 1, 0, 0, 1},
    {1, 0, 0, 0, 0}
};

void traverse(int u, bool visited[]) {
    visited[u] = true;
    for (int v = 0; v < NODE; v++) {
        if (graph[u][v]) {
            if (!visited[v])
                traverse(v, visited);
        }
    }
}

bool isConnected() {
    bool *vis = new bool[NODE];
    for (int u = 0; u < NODE; u++) {
        for (int i = 0; i < NODE; i++)
            vis[i] = false;
        traverse(u, vis);
        for (int i = 0; i < NODE; i++) {
            if (!vis[i])
                return false;
        }
    }
    return true;
}

bool hasEulerPath() {
    int an = 0, bn = 0;
    if (!isConnected()) return false;
    
    vector<int> inward(NODE, 0), outward(NODE, 0);
    for (int i = 0; i < NODE; i++) {
        int sum = 0;
        for (int j = 0; j < NODE; j++) {
            if (graph[i][j]) {
                inward[j]++;
                sum++;
            }
        }
        outward[i] = sum;
    }
    
    if (inward == outward) return true; // यूलर सर्किट
    
    for (int i = 0; i < NODE; i++) {
        if (inward[i] != outward[i]) {
            if (inward[i] + 1 == outward[i]) an++;
            else if (inward[i] == outward[i] + 1) bn++;
        }
    }
    
    return (an == 1 && bn == 1);
}

int main() {
    if (hasEulerPath())
        cout << "यूलर पथ मिला।";
    else
        cout << "कोई यूलर सर्किट नहीं।";
    return 0;
}

आउटपुट

यूलर पथ मिला।

मुख्य शर्तें सारांश (निर्देशित ग्राफ)

स्थितिइन-डिग्रीआउट-डिग्रीपरिणाम
यूलर सर्किटसभी के लिए समानसभी के लिए समानहां (पथ भी है)
यूलर पथ (सर्किट नहीं)एक वर्टेक्स: out = in+1
एक वर्टेक्स: in = out+1
बाकी: in = out
तदनुसारहां
कोई यूलर पथ नहींउपरोक्त से कोई भी विचलन-नहीं
  1. C++ प्रोग्राम: जांचें कि क्या एक निर्देशित ग्राफ में यूलरियन चक्र है C++ प्रोग्राम: जांचें कि क्या एक निर्देशित ग्राफ में यूलरियन चक्र है

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

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

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

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

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