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

वर्टेक्स कवर समस्या

एक अनडायरेक्टेड ग्राफ के लिए, वर्टेक्स कवर वर्टेक्स का एक सबसेट है, जहां ग्राफ के प्रत्येक एज (u, v) के लिए या तो u या v सेट में होता है।

बाइनरी ट्री का उपयोग करके, हम वर्टेक्स कवर समस्या को आसानी से हल कर सकते हैं।

इस समस्या को दो सब-प्रॉब्लम्स में विभाजित किया जा सकता है। जब रूट वर्टेक्स कवर का हिस्सा होता है। इस मामले में, रूट सभी बच्चों के एज को कवर करता है। हम बाएं और दाएं सब-ट्री के लिए वर्टेक्स कवर का आकार आसानी से ढूंढ सकते हैं, और रूट के लिए 1 जोड़ सकते हैं।

इनपुट और आउटपुट

इनपुट: एक बाइनरी ट्री।
आउटपुट: वर्टेक्स कवर 3 है।

एल्गोरिदम

vertexCover(root node)

इस समस्या में, एक बाइनरी ट्री बनेगा, प्रत्येक नोड डेटा और उस नोड द्वारा कवर किए गए वर्टेक्स की संख्या रखेगा।

इनपुट: बाइनरी ट्री का रूट।
आउटपुट: रूट द्वारा कवर किए गए वर्टेक्स की संख्या।

शुरुआत
    यदि root φ है, तो
        वापस 0
    यदि root का कोई बच्चा नहीं है, तो
        वापस 0
    यदि vCover(root) ≠ 0, तो
        वापस vCover(root)
    withRoot := 1 + vertexCover(left(root)) + vertexCover(right(root))
    withoutRoot := 0
    यदि root का बायां बच्चा है, तो
        withoutRoot := withoutRoot + vertexCover(left(left(root))) + vertexCover(left(right(root)))
    यदि root का दायां बच्चा है, तो
        withoutRoot := withoutRoot + vertexCover(right(left(root))) + vertexCover(right(right(root)))
    वापस vCover(root)
अंत

उदाहरण (C++ कोड)

#include <iostream>
#include <algorithm>
using namespace std;

struct node {
    int data;
    int vCover;
    node *left, *right;
};

node *getNode(int data) {
    node *newNode = new (node);
    newNode->data = data;
    newNode->vCover = 0;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

int vertexCover(node *root) {
    if(root == NULL)
        return 0;
    if(root->left == NULL && root->right == NULL)
        return 0;
    if(root->vCover != 0)
        return root->vCover;
    
    int sizeWithRoot = 1 + vertexCover(root->left) + vertexCover(root->right);
    int sizeWithOutRoot = 0;
    
    if(root->left != NULL)
        sizeWithOutRoot += 1 + vertexCover(root->left->left) + vertexCover(root->left->right);
    if(root->right != NULL)
        sizeWithOutRoot += 1 + vertexCover(root->right->left) + vertexCover(root->right->right);
    
    root->vCover = (sizeWithRoot < sizeWithOutRoot) ? sizeWithRoot : sizeWithOutRoot;
    return root->vCover;
}

int main() {
    node *root = getNode(20);
    root->left = getNode(8); root->right = getNode(22);
    root->left->left = getNode(4); root->left->right = getNode(12);
    root->left->right->left = getNode(10); root->left->right->right = getNode(14);
    root->right->right = getNode(25);
    cout << "Minimal vertex cover: " << vertexCover(root);
}

आउटपुट

Minimal vertex cover: 3
  1. M-कलरिंग समस्या M-कलरिंग समस्या

    इस समस्या में, एक अनडायरेक्टेड ग्राफ दिया गया है। m रंग भी प्रदान किए गए हैं। समस्या यह ढूंढना है कि क्या नोड्स को m अलग-अलग रंगों के साथ असाइन करना संभव है, जैसे कि ग्राफ के कोई दो आसन्न वर्टेक्स एक ही रंग के न हों। यदि समाधान मौजूद है, तो प्रदर्शित करें कि कौन सा रंग किस वर्टेक्स पर असाइन किया गय

  1. सांप और सीढ़ी समस्या सांप और सीढ़ी समस्या

    हम प्रसिद्ध खेल सांप और सीढ़ी के बारे में जानते हैं। इस खेल में, बोर्ड पर कुछ कमरे होते हैं, कमरा संख्या के साथ। कुछ कमरे सीढ़ी या सांप से जुड़े होते हैं। जब हमें सीढ़ी मिलती है, तो हम क्रमिक रूप से आगे बढ़े बिना गंतव्य के निकट पहुंचने के लिए कुछ कमरों तक चढ़ सकते हैं। इसी तरह, जब हमें कुछ सांप मिल

  1. सबसे बड़ा इंडिपेंडेंट सेट समस्या सबसे बड़ा इंडिपेंडेंट सेट समस्या

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