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

C++ प्रोग्राम में ट्री में पूर्वज-वंशज संबंध के लिए क्वेरी

समस्या विवरण

इस समस्या में, हमें N वर्टेक्स वाला एक ट्री और Q क्वेरीज दी गई हैं जिनमें प्रत्येक में दो मान i और j होते हैं। हमारा कार्य ट्री में पूर्वज-वंशज संबंध के लिए क्वेरी को हल करने का प्रोग्राम बनाना है।

प्रत्येक क्वेरी को हल करने के लिए, हमें जांचना होगा कि नोड i ट्री में नोड j का पूर्वज है या नहीं।

उदाहरण

समस्या को समझने के लिए एक उदाहरण लेते हैं,

C++ प्रोग्राम में ट्री में पूर्वज-वंशज संबंध के लिए क्वेरी

Q = 2, query[][] = {{3, 5}, {1, 6}}

आउटपुट

No Yes

व्याख्या

i = 3, j = 5: नोड 3, नोड 5 का पूर्वज नहीं है। NO वापस करें।
i = 1, j = 6: नोड 1, नोड 6 का पूर्वज है। YES वापस करें।

हल करने का दृष्टिकोण

इस समस्या का एक हल ट्री ट्रैवर्सल तकनीक DFS (डेप्थ फर्स्ट सर्च) का उपयोग करना है। हम ith नोड से ट्रैवर्स करेंगे और उसके सभी वंशजों तक जाएंगे और फिर जांचेंगे कि jth नोड इसका वंशज है या नहीं। इस समस्या को हल करने का एक कुशल तरीका प्रत्येक नोड का टाइम-इन और टाइम-आउट ढूंढना है। और जांचना है कि क्या वे पूर्वज-वंशज संबंध साझा करते हैं।

उदाहरण

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

void depthFirstSearch(vector<int> g[], int u, int parent, int entTime[], int exitTime[], int& cnt) {
    entTime[u] = cnt++;
    for (int i = 0; i < g[u].size(); i++) {
        int v = g[u][i];
        if (v != parent) 
            depthFirstSearch(g, v, u, entTime, exitTime, cnt);
    }
    exitTime[u] = cnt++;
}

void calcTimeInAndOut(int edges[][2], int V, int entTime[], int exitTime[]) {
    vector<int> g[V];
    for (int i = 0; i < V - 1; i++) {
        int u = edges[i][0];
        int v = edges[i][1];
        g[u].push_back(v);
        g[v].push_back(u);
    }
    int cnt = 0;
    depthFirstSearch(g, 0, -1, entTime, exitTime, cnt);
}

int main() {
    int edges[][2] = { { 0, 1 }, { 0, 2 }, { 1, 3 }, { 1, 4 }, { 4, 5 }, { 5, 6 }, { 5, 7 }};
    int E = sizeof(edges) / sizeof(edges[0]);
    int V = E + 1;
    int Q = 2;
    int query[Q][2] = {{3, 5}, {1, 6}};
    int entTime[V], exitTime[V];
    calcTimeInAndOut(edges, V, entTime, exitTime);
    for (int i = 0; i < Q; i++) {
        cout << "For query " << (i+1) << " : ";
        (entTime[query[i][0]] <= entTime[query[i][1]] && 
         exitTime[query[i][0]] >= exitTime[query[i][1]]) ? 
            cout << "is Ancestor\n" : cout << "is not Ancestor\n";
    }
    return 0;
}

आउटपुट

For query 1 : is not Ancestor
For query 2 : is Ancestor
  1. C++ में ट्री डायमीटर C++ में ट्री डायमीटर

    मान लीजिए हमारे पास एक अनडायरेक्टेड ट्री है; हमें इसका डायमीटर ढूंढना है - उस ट्री में सबसे लंबे पथ में एज की संख्या उस ट्री का डायमीटर है। यहां ट्री को एज लिस्ट के रूप में दिया गया है जहां edges[i] = [u, v] नोड्स u और v के बीच एक बायडायरेक्शनल एज है। प्रत्येक नोड के लेबल सेट {0, 1, ..., edges.lengt

  1. C++ में सरणी के एलिमेंट्स का गुणनफल C++ में सरणी के एलिमेंट्स का गुणनफल

    पूर्णांक एलिमेंट्स की एक सरणी दी गई है और कार्य सरणी के एलिमेंट्स को गुणा करना और प्रदर्शित करना है। उदाहरण इनपुट-: arr[]={1,2,3,4,5,6,7} आउटपुट-: 1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040 इनपुट-: arr[]={3, 4,6, 2, 7, 8, 4} आउटपुट-: 3 x 4 x 6 x 2 x 7 x 8 x 4 = 32256 नीचे दिए गए प्रोग्राम में उपयोग किया गया द

  1. C++ में ऑक्टल से डेसिमल रूपांतरण C++ में ऑक्टल से डेसिमल रूपांतरण

    एक ऑक्टल संख्या इनपुट के रूप में दी गई है, कार्य दी गई ऑक्टल संख्या को डेसिमल संख्या में बदलना है। कंप्यूटर में डेसिमल संख्याओं को आधार 10 के साथ दर्शाया जाता है और ऑक्टल संख्या को आधार 8 के साथ दर्शाया जाता है जो अंक 0 से 7 तक होती है जबकि डेसिमल संख्याएं 0-9 से शुरू होने वाला कोई भी संख्यात्मक अंक