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

C++ प्रोग्राम: बाइनरी खोज का उपयोग करके ग्राफ के न्यूनतम वर्टेक्स कवर आकार को खोजना


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

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

उदाहरण के लिए, ग्राफ लें

2 ---- 4 ---- 6
|      |     |
|      |     |
3 ---- 5

यहां, न्यूनतम वर्टेक्स कवर में शीर्ष 3 और 4 शामिल हैं। ग्राफ के सभी किनारे ग्राफ के शीर्ष 3 या 4 पर आपतित हैं।

उदाहरण

#include <bits/stdc++.h>
using namespace std;
#define max 15

// ग्राफ को संग्रहीत करने के लिए एरे
bool arr[max][max];

// जांचें कि क्या न्यूनतम वर्टेक्स कवर मौजूद है
bool check_cover(int V, int k, int E) {
    int set = (1 << k) - 1;
    int limit = (1 << V);
    // आकार 'k' के किनारों को चिह्नित करने के लिए
    bool vis[max][max];
    while (set < limit) {
        // प्रत्येक पुनरावृत्ति के लिए वर्टेक्स कवर रीसेट करना
        memset(vis, 0, sizeof vis);
        int count = 0;
        // उन मानों की जांच करना जिनका मान उच्च है
        for (int j = 1, v = 1; j < limit; j = j << 1, v++) {
            if (set & j) {
                // किनारों को विजिटेड मार्क करना
                for (int k = 1; k <= V; k++) {
                    if (arr[v][k] && !vis[v][k]) {
                        vis[v][k] = 1;
                        vis[k][v] = 1;
                        count++;
                    }
                }
            }
        }
        // यदि सभी किनारे कवर हैं
        if (count == E)
            return true;
        int c = set & -set;
        int r = set + c;
        set = (((r ^ set) >> 2) / c) | r;
    }
    return false;
}

// न्यूनतम वर्टेक्स कवर खोजने के लिए
int find_cover(int n, int m) {
    // बाइनरी खोज करना
    int left = 1, right = n;
    while (right > left) {
        int mid = (left + right) >> 1;
        if (check_cover(n, mid, m) == false)
            left = mid + 1;
        else
            right = mid;
    }
    return left;
}

// ग्राफ में किनारा डालने के लिए
void add_edge(int u, int v) {
    arr[u][v] = 1;
    arr[v][u] = 1;
}

int main() {
    memset(arr, 0, sizeof arr);
    int V = 6, E = 5;
    add_edge(2, 3);
    add_edge(2, 4);
    add_edge(3, 5);
    add_edge(4, 5);
    add_edge(4, 6);
    cout << "Size of Minimum Vertex Cover : " << find_cover(V, E) << endl;
    return 0;
}

आउटपुट

Size of Minimum Vertex Cover : 2

  1. - C++ में k सबलिस्ट्स के न्यूनतम सबसे बड़े योग को ढूंढने का प्रोग्राम

    समस्या विवरण मान लीजिए हमारे पास nums नामक संख्याओं की एक सूची और एक मान k है। हम इस सूची को k गैर-खाली सबलिस्ट्स में विभाजित कर सकते हैं। हमें k सबलिस्ट्स के न्यूनतम सबसे बड़े योग को ढूंढना है। उदाहरण के लिए, यदि इनपुट है nums = [2, 4, 3, 5, 12] और k = 2, तो आउटपुट 14 होगा, क्योंकि हम सूची को [2, 4

  1. - C++ में BST में इनऑर्डर सक्सेसर खोजें - सबसे छोटा बड़ा कुंजी

    समस्या विवरण मान लीजिए हमारे पास एक बाइनरी सर्च ट्री BST और एक नोड का मान है, हमें BST में उस नोड का इनऑर्डर सक्सेसर ढूंढना है। जैसा कि हम सभी जानते हैं कि नोड p का सक्सेसर वह नोड है जिसकी कुंजी p के मान से सबसे छोटी बड़ी है। उदाहरण के लिए, यदि इनपुट इस तरह का ट्री है: और p = 1, तो आउटपुट 2 होगा।

  1. C++ में बाइनरी खोज प्रोग्राम C++ में बाइनरी खोज प्रोग्राम

    बाइनरी खोज क्या है? बाइनरी खोज (आधा-अंतराल खोज) एक खोज एल्गोरिदम है जो क्रमबद्ध सरणी में लक्ष्य मान की स्थिति ढूंढता है। यह लक्ष्य मान की तुलना मध्य तत्व से करता है और खोज स्थान को आधा कर देता है। मुख्य बिंदु केवल क्रमबद्ध सरणी पर काम करता है समय जटिलता: O(log n) दुनिया के सभी नाम क्रमबद्ध हों तो