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

C++ প্রোগ্রাম: গ্রাফ থেকে এজ মুছে স্কোর সর্বনিম্ন করায় সর্বোচ্চ কমতি


মান লিজিয়ে, একটি ভারসাম্যপূর্ণ, অনির্দেশ গ্রাফ আছে যাতে n টি ভেরটেক্স এবং m টি এজ রয়েছে। গ্রাফের স্কোর হলো সব এজের ওজনগুলোর যোগফল। এজের ওজন ঋণাত্মক হতে পারে, এবং এগুলো মুছে ফেললে গ্রাফের স্কোর বাড়ে। আমাদের কাজ হলো গ্রাফটি সংযুক্ত রেখে এজ মুছে ফেলে গ্রাফের স্কোর সর্বনিম্ন করা। আমাদের লক্ষ্য হলো স্কোরে সর্বোচ্চ কত কমতি আনা যায় তা বের করা।

গ্রাফটি 'edges' অ্যারেতে দেওয়া আছে, যেখানে প্রতিটি উপাদান হলো {weight, {vertex1, vertex2}}।

যেমন, ইনপুট হলে n = 5, m = 6, edges = {{2, {1, 2}}, {2, {1, 3}}, {1, {2, 3}}, {3, {2, 4}}, {2, {2, 5}}, {1, {3, 5}}}, তবে আউটপুট হবে 4।

C++ প্রোগ্রাম: গ্রাফ থেকে এজ মুছে স্কোর সর্বনিম্ন করায় সর্বোচ্চ কমতি

যদি আমরা (1, 2) এবং (2, 5) এজগুলো মুছে ফেলি, তবে স্কোরে মোট ৪ কমানো যায় এবং গ্রাফ সংযুক্ত থাকে।

সমাধানের ধাপসমূহ

এই সমস্যাটি সমাধান করার জন্য নিচের ধাপগুলো অনুসরণ করব:

cnum := 0 par অ্যারে সংজ্ঞায়িত করুন আকার: ১০০। dim অ্যারে সংজ্ঞায়িত করুন আকার: ১০০। make() ফাংশন সংজ্ঞায়িত করুন, যা v গ্রহণ করবে: par[v] := v dim[v] := 1 find() ফাংশন সংজ্ঞায়িত করুন, যা v গ্রহণ করবে: if par[v] == v, তবে: return v return par[v] = find(par[v]) unify() ফাংশন সংজ্ঞায়িত করুন, যা a, b গ্রহণ করবে: a := find(a) b := find(b) if a != b, তবে: (cnum ১ কমিয়ে) if dim[a] > dim[b], তবে: a, b স왪 করুন par[a] := b dim[b] := dim[b] + dim[a] cnum := n edges অ্যারে ওজন অনুযায়ী সোর্ট করুন i := 1 থেকে n পর্যন্ত: make(i) res := 0 edges-র প্রতিটি edge জন্য: a := edge-র ১ম ভেরটেক্স b := edge-র ২য় ভেরটেক্স weight := edge-র ওজন if find(a) == find(b), তবে: if weight >= 0, তবে: res := res + 1 * weight continue if cnum == 1, তবে: if weight >= 0, তবে: res := res + 1 * weight অন্যথায়: unify(a, b) return res

উদাহরণ

নিচের ইমপ্লিমেন্টেশনটি দেখুন আরও ভালো বুঝতে:

#include <bits/stdc++.h> using namespace std; int cnum = 0; int par[100]; int dim[100]; void make(int v){    par[v] = v;    dim[v] = 1; } int find(int v){    if(par[v] == v)    return v;    return par[v] = find(par[v]); } void unify(int a, int b){    a = find(a); b = find(b);    if(a != b){       cnum--; if(dim[a] > dim[b]){          swap(a, b);       }       par[a] = b; dim[b] += dim[a];    } } int solve(int n, int m, vector <pair <int, pair<int,int>>> edges){    cnum = n;    sort(edges.begin(), edges.end());    for(int i = 1; i <= n; i++)       make(i);    int res = 0;    for(auto &edge : edges){       int a = edge.second.first;       int b = edge.second.second;       int weight = edge.first;       if(find(a) == find(b)) {          if(weight >= 0)             res += 1 * weight;          continue;       }       if(cnum == 1){          if(weight >= 0)             res += 1 * weight;       } else{ unify(a, b); } } return res; } int main() { int n = 5, m = 6; vector <pair<int, pair<int,int>>> edges = {{2, {1, 2}}, {2, {1, 3}}, {1, {2, 3}}, {3, {2, 4}}, {2, {2, 5}}, {1, {3, 5}}}; cout<< solve(n, m, edges); return 0; }

ইনপুট

5, 6, {{2, {1, 2}}, {2, {1, 3}}, {1, {2, 3}}, {3, {2, 4}}, {2, {2, 5}}, {1, {3, 5}}} 

আউটপুট

4

  1. C++ প্রোগ্রাম: গ্রাফে সুপার ভেরটেক্স চিহ্নিতকরণ

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

  3. সি++ প্রোগ্রাম: আনডিরেক্টেড গ্রাফের কানেক্টেড কম্পোনেন্টস (Connected Components) বের করা

  4. C++ প্রোগ্রাম: গ্রাফের এজ কানেক্টিভিটি (Edge Connectivity) বের করা