কম্পিউটার টিউটোরিয়াল

C++-এ ট্রি-এ অ্যানসেস্টার-ডেসেন্ডেন্ট রিলেশনশিপ কুয়েরি


সমস্যা

একটি রুটেড ট্রি এবং Q কুয়েরি দেওয়া। প্রতিটি কুয়েরিতে দুটি নোড u, v দেওয়া থাকবে। যাচাই করুন u কি v-এর অ্যানসেস্টার (প্রাজ্ঞ) বা v কি u-এর অ্যানসেস্টার।

অ্যালগরিদম: DFS টাইমস্ট্যাম্প (In-time / Out-time)

  • DFS ট্রাভার্সালে প্রতিটি নোডের tin[u] (প্রবেশ সময়) এবং tout[u] (প্রস্থান সময়) রেকর্ড করুন।
  • u হল v-এর অ্যানসেস্টার ⟺ tin[u] <= tin[v] && tout[v] <= tout[u]।

C++ কোড

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

void dfs(vector<int> g[], int u, int parent, int tin[], int tout[], int& timer) {
    tin[u] = ++timer;
    for (int v : g[u]) if (v != parent)
        dfs(g, v, u, tin, tout, timer);
    tout[u] = ++timer;
}

bool isAncestor(int u, int v, int tin[], int tout[]) {
    return tin[u] <= tin[v] && tout[v] <= tout[u];
}

int main() {
    int edges[][2] = {{0,1},{0,2},{1,3},{1,4},{2,5}};
    int V = 6;
    vector<int> g[V];
    for (auto &e : edges) {
        g[e[0]].push_back(e[1]);
        g[e[1]].push_back(e[0]);
    }
    int tin[V], tout[V], timer = 0;
    dfs(g, 0, -1, tin, tout, timer);
    cout << (isAncestor(1,5,tin,tout) ? "yes" : "no"); // no
}

আউটপুট

no

কমপ্লেক্সিটি

  • প্রিপ্রসেসিং: O(V+E)
  • প্রতি কুয়েরি: O(1)
  1. C++-এ ট্রি ডায়ামিটার

  2. C++-এ ডিসকানেক্টেড গ্রাফের জন্য BFS

  3. C++ প্রোগ্রাম: অ্যারে উপাদানগুলোর গুণফল বের করা

  4. C++-এ অক্টাল থেকে ডেসিমেল কনভার্সন প্রোগ্রাম