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

ভার্টেক্স কভার সমস্যা (Vertex Cover Problem)

একটি অনির্দেশিত গ্রাফের জন্য, ভার্টেক্স কভার হল ভেরটেক্সের একটি সাবসেট, যেখানে গ্রাফের প্রতিটি এজ (u, v)-র জন্য u বা v সেটে থাকে।

বাইনারি ট্রি ব্যবহার করে ভার্টেক্স কভার সমস্যা সহজে সমাধান করা যায়।

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

ইনপুট এবং আউটপুট

ইনপুট: একটি বাইনারি ট্রি।
ভার্টেক্স কভার সমস্যা (Vertex Cover Problem)
আউটপুট: ভার্টেক্স কভার ৩।
ভার্টেক্স কভার সমস্যা (Vertex Cover Problem)

অ্যালগরিদম

vertexCover(root node)

এই সমস্যায় একটি বাইনারি ট্রি গঠন করা হবে, প্রতিটি নোড ডেটা এবং সেটির দ্বারা কভার করা ভার্টেক্স সংখ্যা ধারণ করবে।

ইনপুট: বাইনারি ট্রির রুট।
আউটপুট: রুট দ্বারা কভার করা ভার্টেক্স সংখ্যা।

শুরু
  যদি root φ হয়, তবে
    ফেরত দিন 0
  যদি root-এর কোনো চাইল্ড নেই, তবে
    ফেরত দিন 0
  যদি vCover(root) ≠ 0 হয়, তবে
    ফেরত দিন vCover(root)
  withRoot := 1 + vertexCover(left(root)) + vertexCover(right(root))
  withoutRoot := 0
  যদি root-এর বাম চাইল্ড থাকে, তবে
    withoutRoot := withoutRoot + vertexCover(left(left(root))) + vertexCover(left(right(root)))
  যদি root-এর ডান চাইল্ড থাকে, তবে
    withoutRoot := withoutRoot + vertexCover(right(left(root))) + vertexCover(right(right(root)))
  vCover(root) := min(withRoot, withoutRoot)
  ফেরত দিন vCover(root)
শেষ

উদাহরণ (C++)

#include <iostream>
#include <algorithm>
using namespace std;

struct node {
  int data;
  int vCover;
  node *left, *right;
};

node *getNode(int data) {
  node *newNode = new (node);
  newNode->data = data;
  newNode->vCover = 0;
  newNode->left = NULL;
  newNode->right = NULL;
  return newNode;
}

int vertexCover(node *root) {
  if(root == NULL) return 0;
  if(root->left == NULL && root->right == NULL) return 0;
  if(root->vCover != 0) return root->vCover;

  int sizeWithRoot = 1 + vertexCover(root->left) + vertexCover(root->right);
  int sizeWithOutRoot = 0;
  if(root->left != NULL)
    sizeWithOutRoot += 1 + vertexCover(root->left->left) + vertexCover(root->left->right);
  if(root->right != NULL)
    sizeWithOutRoot += 1 + vertexCover(root->right->left) + vertexCover(root->right->right);

  root->vCover = (sizeWithRoot < sizeWithOutRoot) ? sizeWithRoot : sizeWithOutRoot;
  return root->vCover;
}

int main() {
  node *root = getNode(20);
  root->left = getNode(8); root->right = getNode(22);
  root->left->left = getNode(4); root->left->right = getNode(12);
  root->left->right->left = getNode(10); root->left->right->right = getNode(14);
  root->right->right = getNode(25);
  cout << "Minimal vertex cover: " << vertexCover(root);
}

আউটপুট

Minimal vertex cover: 3
  1. র্যাট ইন ए মেজ সমস্যা

  2. M-কালারিং সমস্যা

  3. স্নেক অ্যান্ড ল্যাডার সমস্যা (Snake and Ladder Problem)

  4. সর্বোচ্চ স্বতন্ত্র সেট সমস্যা (Largest Independent Set)