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

C++-এ ট্রিতে এজ যোগ করে বাইপার্টাইট গ্রাফ বানाये রাখতে সর্বোচ্চ এজ সংখ্যা


সমস্যা বিবরণ

একটি ট্রি সবসময় একটি বাইপার্টাইট গ্রাফ হয় কারণ আমরা সবসময় এটিকে ব germana পর্যায়ে দুটি আলাদা সেটে ভাগ করতে পারি।

অন্য কথায়, আমরা সবসময় এটিকে দুটি রং দিয়ে রঙ করতে পারি যাতে বdeutschen পর্যায়ে একই রং থাকে। কাজ হলো ট্রিতে সর্বোচ্চ কতগুলো এজ যোগ করা যায় যাতে সেটি বাইপার্টাইট গ্রাফ বানায় থাকে।

উদাহরণ

ট্রির এজগুলো নিচের মতো ভার্টেক্স জোড়া হিসেবে দেওয়া আছে −

{1, 2}

{1, 3}

{2, 4}

{3, 5} এখানে বাইপার্টাইট গ্রাফ বানাতে ২টি আরও এজ যোগ করতে হবে

  • রঙিন গ্রাফে {1, 4, 5} এবং {2, 3} দুটি আলাদা সেট তৈরি হয়। যেহেতু ১, ২ এবং ৩ উভয়ের সাথে সংযুক্ত
  • বাকি আছে ৪ এবং ৫ এর এজ। যেহেতু ৪ ইতিমধ্যে ২-এর সাথে এবং ৫, ৩-এর সাথে সংযুক্ত। তাই শুধু বাকি অপশন হলো {4, 3} এবং {5, 2}

অ্যালগরিদম

  • গ্রাফের একটি সাধারণ DFS বা BFS ট্রাভার্সাল করুন এবং দুটি রং দিয়ে রঙ করুন
  • রঙ করার সময় দুটি রংয় রঙ করা নোডের সংখ্যা গণনা করুন। দুটি কাউন্ট ক्रमশः count_color0 এবং count_color1
  • এখন আমরা জানি একটি বাইপার্টাইট গ্রাফে সর্বোচ্চ count_color0 x count_color1 এজ থাকতে পারে
  • আমরা জানি n নোডের ট্রিতে n-1টি এজ থাকে
  • তবে আমাদের উত্তর হবে count_color0 x count_color1 – (n-1)

উদাহরণ

#include <bits/stdc++.h> using namespace std; long long count_color[2]; void dfs(vector<int> graph[], int node, int parent, int color) {    ++count_color[color];    for (int i = 0; i < graph[node].size(); ++i) {       if (graph[node][i] != parent) {          dfs(graph, graph[node][i], node, !color);       }    } } int getMaxEdges(vector<int> graph[], int n) {    dfs(graph, 1, 0, 0);    return count_color[0] * count_color[1] - (n - 1); } int main() {    int n = 5;    vector<int> graph[n + 1];    graph[1].push_back(2);    graph[1].push_back(3);    graph[2].push_back(4);    graph[3].push_back(5);    cout << "Maximum edges = " << getMaxEdges(graph, n) << endl;    return 0; }

আউটপুট

প্রোগ্রামটি কম্পাইল ও এক্সিকিউট করলে নিচের আউটপুট পাওয়া যাবে −

Maximum edges = 2

  1. C++ প্রোগ্রাম: গ্রাফে ব্রিজ এজের সংখ্যা নির্ণয়

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

  3. C++-এ অনির্দেশিত গ্রাফে এজ (Edge) সংখ্যা গণনা

  4. সি++ প্রোগ্রাম: গ্রাফকে ডিসকানেক্টেড করার জন্য ন্যূনতম এজ কাট (Minimum Edges to Cut) বের করা