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

C++-এ ট্রি-এর যেকোনো দুটি ভার্টেক্সের ডিগ্রি গুণফলের যোগফল সর্বাধিক করা


দেওয়া কাজ হল একটি দেওয়া ইন্টিজার N দিয়ে একটি ট্রি নির্মাণ করা যাতে, সকল অর্ডার্ড পেয়ার (x,y) এর জন্য degree(x) * degree(y) এর যোগফল সর্বোচ্চ হয় এবং x ≠ y।

উদাহরণ দিয়ে বোঝা যাক

ইনপুট - N=5

আউটপুট - ৫০

ব্যাখ্যা

    1
     \
      2
       \
        3
         \
          4
           \
            5
১ম নোডের ডিগ্রি = ১
২য় নোডের ডিগ্রি = ২
৩য় নোডের ডিগ্রি = ২
৪র্থ নোডের ডিগ্রি = ২
৫ম নোডের ডিগ্রি = ১

সকল অর্ডার্ড পেয়ার (x, y) এর ডিগ্রি গুণফলের যোগফল -

১ম নোড = ১*২ + ১*২ + ১*২ + ১*১ = ৭
২য় নোড = ২*১ + ২*২ + ২*২ + ২*১ = ১২
৩য় নোড = ২*১ + ২*২ + ২*২ + ২*১ = ১২
৪র্থ নোড = ২*১ + ২*২ + ২*২ + ২*১ = ১২
৫ম নোড = ১*২ + ১*২ + ১*২ + ১*১ = ৭
মোট যোগফল = ৫০

ইনপুট - N=7

আউটপুট - ১২২

প্রোগ্রামে ব্যবহৃত পদ্ধতি

  • একটি ট্রিতে সকল নোডের ডিগ্রির যোগফল = (2 * N) - 2। এখানে N = ট্রিতে নোডের সংখ্যা। যোগফল সর্বাধিক করতে হলে লিফ নোডের সংখ্যা ন্যূনতম করতে হবে।

  • Max() ফাংশনে int sum=0 আরম্ভ করুন এবং x=1 এবং y=1 থেকে x<=N এবং y<=N কন্ডিশন সহ নেস্টেড লুপ তৈরি করুন।

  • নেস্টেড লুপের ভেতরে প্রথমে চেক করুন if(x==y), সত্য হলে continue; স্টেটমেন্ট দিন।

  • অন্যথায় int degree=2 আরম্ভ করুন এবং if স্টেটমেন্ট দিয়ে চেক করুন if(x==1 || x==n)। সত্য হলে degreeX=1। y-এর জন্যও একইভাবে degreeY নির্ণয় করুন।

  • শেষে লুপ বন্ধ করার আগে sum ভেরিয়েবল আপডেট করুন - sum += (degreeX * degreeY)।

C++ প্রোগ্রাম উদাহরণ

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

int Max(int N){
    int sum = 0;
    for (int x = 1; x <= N; x++){
        for (int y = 1; y <= N; y++){
            if (x == y)
                continue;
            // নোড x-এর ডিগ্রি ২ আপডেট
            int degreeX = 2;
            // যদি x লিফ নোড বা রুট নোড হয়
            if (x == 1 || x == N)
                degreeX = 1;
            // নোড y-এর ডিগ্রি ২ আপডেট
            int degreeY = 2;
            // যদি y লিফ নোড বা রুট নোড হয়
            if (y == 1 || y == N)
                degreeY = 1;
            // যোগফল আপডেট
            sum += (degreeX * degreeY);
        }
    }
    return sum;
}

// মেইন ফাংশন
int main(){
    int N = 5;
    cout << Max(N);
}

আউটপুট

50
  1. সি++-এ কমপ্লিট বাইনারি ট্রির মিরর ইমেজ নোডগুলোর ইনঅর্ডার যোগফল

  2. C++-এ বাইনারি ট্রিতে যেকোনো দুটি নোডের পথের XOR

  3. বাইনারি ট্রিতে নিকটতম লিফ নোড খুঁজে বের করা (C++)

  4. C++ প্রোগ্রামিং-এ বাইনারি ট্রিতে যেকোনো দুটি নোডের পথ প্রিন্ট করা