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

C++-এ ট্রি থেকে কোড়া সংখ্যক ভের্টেক্স বিশিষ্ট ইভেন ফরেস্ট बनाने জন্য সর্বোচ্চ এজ সরানো

সমস্যা বিবরণ

একটি অনির্দেশিত ট্রি দেওয়া আছে যাতে কোড়া সংখ্যক ভের্টেক্স আছে। আমাদের এই ট্রি থেকে সর্বোচ্চ সংখ্যক এজ সরাতে হবে যাতে ফলাফলস্বরূপ ফরেস্টের প্রতিটি সংযুক্ত কম্পোনেন্টে কোড়া সংখ্যক ভের্টেক্স থাকে।

উদাহরণ

C++-এ ট্রি থেকে কোড়া সংখ্যক ভের্টেক্স বিশিষ্ট ইভেন ফরেস্ট बनाने জন্য সর্বোচ্চ এজ সরানো

উপরোক্ত ট্রিতে, আমরা সর্বোচ্চ ২টি এজ 0-2 এবং 0-4 (লাল রঙে দেখানো) সরাতে পারি যাতে প্রতিটি সংযুক্ত কম্পোনেন্টে কোড়া সংখ্যক ভের্টেক্স থাকে।

অ্যালগরিদম

  • যেকোনো স্টার্টিং নোড থেকে DFS করুন কারণ ট্রি সংযুক্ত।
  • কারেন্ট নোডের অধীনে রুট করা সাবট্রির নোড সংখ্যা ০ দিয়ে আরম্ভ করুন।
  • কারেন্ট নোডের প্রতিটি সাবট্রির জন্য রিকার্সিভভাবে নিচের কাজ করুন:
    • যতি কারেন্ট সাবট্রির আকার কোড়া হয়, রেজাল্ট ১ বাড়ান কারণ সাবট্রিটি ডিসকানেক্ট করা সম্ভব।
    • অন্যথায় কারেন্ট সাবট্রির নোড সংখ্যা কারেন্ট কাউন্টে যোগ করুন।

উদাহরণ

#include <bits/stdc++.h> 
using namespace std; 
int dfs(vector<int> g[], int u, bool visit[], int& res) { 
    visit[u] = true; 
    int currComponentNode = 0; 
    for (int i = 0; i < g[u].size(); i++) { 
        int v = g[u][i]; 
        if (!visit[v]) { 
            int subtreeNodeCount = dfs(g, v, visit, res); 
            if (subtreeNodeCount % 2 == 0) 
                res++; 
            else 
                currComponentNode += subtreeNodeCount; 
        } 
    } 
    return (currComponentNode + 1); 
} 
int maxEdgeRemovalToMakeForestEven(vector<int> g[], int N) { 
    bool visit[N + 1]; 
    for (int i = 0; i <= N; i++) 
        visit[i] = false; 
    int res = 0; 
    dfs(g, 0, visit, res); 
    return res; 
} 
void addEdge(vector<int> g[], int u, int v) { 
    g[u].push_back(v); 
    g[v].push_back(u); 
} 
int main() { 
    int edges[][2] = {{0, 2}, {0, 1}, {0, 4}, {2, 3}, {4, 5}, {5, 6}, {5, 7}}; 
    int N = sizeof(edges) / sizeof(edges[0]); 
    vector<int> g[N + 1]; 
    for (int i = 0; i < N; i++) 
        addEdge(g, edges[i][0], edges[i][1]); 
    cout << "Answer = " << maxEdgeRemovalToMakeForestEven(g, N) << endl; 
    return 0; 
}

আউটপুট

Answer = 2
  1. C++-এ ট্রিতে দুটি অ-অন্তঃচ্ছেদী পথের সর্বোচ্চ গুণফল (Maximum product of two non-intersecting paths in a tree)

  2. C++-এ ট্রি ডায়ামিটার

  3. বাইনারি ট্রিতে ভার্টিকাল সমের সর্বোচ্চ মান খুঁজে বের করা C++-তে

  4. C++-এ কমপ্লিট গ্রাফ থেকে সর্বোচ্চ এজ-ডিজয়েন্ট স্প্যানিং ট্রি বের করা