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

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


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

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

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

গ্রাফে মাত্র একটি ব্রিজ এজ রয়েছে যা হলো {2, 4}।

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

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

mSize := 100 G অ্যারে সংজ্ঞায়িত করুন আকার mSize bridge ২D অ্যারে সংজ্ঞায়িত করুন visited অ্যারে সংজ্ঞিত করুন আকার mSize vk এবং l অ্যারে সংজ্ঞায়িত করুন আকার mSize edges অ্যারে সংজ্ঞায়িত করুন যাতে ইন্টিজার পেয়ার থাকে depthSearch() ফাংশন সংজ্ঞায়িত করুন, যা v, p (ডিফল্ট -1) গ্রহণ করবে: visited[v] := 1 vk[v] := (l[v] = t কে ১ বাড়িয়ে) G[v]-র প্রতিটি x জন্য: if x == p, তবে: continue if visited[x] নন-জিরো, তবে: l[v] := min(l[v], vk[x]) অন্যথায়: depthSearch(x, v) l[v] := min(l[v], l[x]) if l[x] > vk[v], তবে: bridge[v, x] := 1 bridgeSearch() ফাংশন সংজ্ঞায়িত করুন: t := 0 i := 1 থেকে n পর্যন্ত: if not visited[i] নন-জিরো, তবে: depthSearch(i) i := 0 থেকে m-1 পর্যন্ত: a := edges[i]-র ১ম মান b := edges[i]-র ২য় মান G[a]-র শেষে b যোগ করুন G[b]-র শেষে a যোগ করুন bridgeSearch() ans := 0 i := 1 থেকে n পর্যন্ত: j := 1 থেকে n পর্যন্ত: if i != j এবং bridge[i, j], তবে: ans ১ বাড়িয়ে return ans

উদাহরণ

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

#include <bits/stdc++.h> using namespace std; const int mSize = 100; vector <int> G[mSize]; int n, m, t; vector<vector<int>> bridge(mSize, vector<int>(mSize)); vector <int> visited(mSize); vector <int> vk(mSize, -1), l(mSize, -1); vector<pair<int, int>> edges; void depthSearch(int v, int p = -1) {    visited[v] = 1;    vk[v] = l[v] = t++;    for (auto x: G[v]) {       if (x == p) {          continue;       }       if (visited[x]) {          l[v] = min(l[v], vk[x]);       } else {          depthSearch(x, v);          l[v] = min(l[v], l[x]);          if (l[x] > vk[v]) {                bridge[v][x] = 1;          }       }    } } void bridgeSearch() {    t = 0;    for (int i = 1; i <= n; ++i) {       if (!visited[i]) {          depthSearch(i);       }    } } int solve(){    for (int i = 0; i < m; ++i) {       int a, b; a = edges[i].first;       b = edges[i].second;       G[a].push_back(b);       G[b].push_back(a);    }    bridgeSearch();    int ans = 0;    for (int i = 1; i <= n; ++i) {       for (int j = 1; j <= n; ++j) {          if (i != j and bridge[i][j]) ans++;       }    }    return ans; } int main() {    n = 5, m = 6;    edges = {{1, 2}, {1, 3}, {2, 3}, {2, 4}, {2, 5}, {3, 5}};    cout<< solve();    return 0; }

ইনপুট

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

আউটপুট

1

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

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

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

  4. C++ প্রোগ্রাম: গ্রিডে আলোকিত কক্ষের সংখ্যা গণনা