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

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


মান লিজিয়ে, n সংখ্যক ভেরটেক্সযুক্ত একটি গ্রাফ দেওয়া আছে। ভেরটেক্সগুলো ১ থেকে n পর্যন্ত নম্বর করা আছে এবং 'edges' অ্যারেতে দেওয়া এজগুলো দ্বারা সংযুক্ত। প্রতিটি ভেরটেক্সের একটি 'x' মান আছে যা ১ থেকে n পর্যন্ত, যা 'values' অ্যারেতে দেওয়া আছে। এখন আমাদের লক্ষ্য হলো গ্রাফ থেকে সুপার ভেরটেক্সগুলো বের করা। একটি ভেরটেক্স i কে 'সুপার ভেরটেক্স' বলা হবে যদি ভেরটেক্স ১ থেকে i পর্যন্ত সবচেয়ে ছোট পথে i-তম ভেরটেক্সের 'x' মানের সমান কোনো ভেরটেক্স না থাকে। আমরা এই শর্ত পূরণ করা সব ভেরটেক্স প্রিন্ট করব।

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

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

ভেরটেক্স ২ বাদে সব ভেরটেক্স শর্ত পূরণ করে। তাই ভেরটেক্স ২ বাদ দেওয়া হয়েছে।

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

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

vertexVal, frq, chk অ্যারে সংজ্ঞায়িত করুন আকার: 100005। vcti অ্যারে সংজ্ঞায়িত করুন আকার 200005। একটি dfs() ফাংশন সংজ্ঞায়িত করুন, যা j, k গ্রহণ করবে: if frq[vertexVal[j]] == 0, তবে: chk[j] := 1 (frq[vertexVal[j]] ১ বাড়িয়ে) vcti[j]-র প্রতিটি মান a জন্য: if a != k, তবে: dfs(a, j) (frq[vertexVal[j]] ১ কমিয়ে) i := 0 দিয়ে আরম্ভ করুন, i < n হলে, (i ১ বাড়িয়ে) করুন: vertexVal[i] := values[i] i := 0 দিয়ে আরম্ভ করুন, i < n হলে, (i ১ বাড়িয়ে) করুন: a := edges[i]-র ১ম মান b := edges[i]-র ২য় মান vcti[a]-র শেষে b যোগ করুন vcti[b]-র শেষে a যোগ করুন dfs(1, 0) i := 1 দিয়ে আরম্ভ করুন, i <= n হলে, (i ১ বাড়িয়ে) করুন: if chk[i] নন-জিরো, তবে: print(i)

উদাহরণ

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

#include <bits/stdc++.h> using namespace std; int n; int vertexVal[100005], frq[100005], chk[100005]; vector<int> vcti[200005]; void dfs(int j, int k){    if (frq[vertexVal[j]] == 0)       chk[j] = 1;    frq[vertexVal[j]]++;    for (auto a : vcti[j]) {       if (a != k)          dfs(a, j);    }    frq[vertexVal[j]]--; } void solve(int values[], vector<pair<int, int>> edges){    for (int i = 0; i < n; i++)       vertexVal[i] = values[i];    for (int i = 0; i < n; i++){       int a, b; a = edges[i].first; b = edges[i].second; vcti[a].push_back(b); vcti[b].push_back(a); } dfs(1, 0); for (int i = 1;i <= n; i++){ if (chk[i]) cout<< i <<endl; } } int main() { n = 5; int values[] = {1, 2, 2, 1, 3}; vector<pair<int, int>> edges = {{1, 2}, {2, 3}, {2, 3}, {2, 4}, {4, 5}}; solve(values, edges); return 0; }

ইনপুট

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

আউটপুট

1 3 4 5

  1. C++ প্রোগ্রাম: দিয়ে দেয়া গ্রাফে q কোয়েরির জন্য শর্টেস্ট পাথ কস্ট

  2. C++ প্রোগ্রাম: দেওয়া পূর্ণসংখ্যাগুলো থেকে সর্বোচ্চ ট্যালি মান নির্ণয়

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

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