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

C++-এ ভালো নোডগুলোর মধ্যে সবচেয়ে ছোট দূরত্ব খুঁজে বের করা


সমস্যা

একটি ওজনযুক্ত অ Diretto গ্রাফে কিছু নোড "ভালো নোড" (good nodes) চিহ্নিত। किन्हीं দুটি ভিন্ন ভালো নোডের মধ্যে সবচেয়ে ছোট পথের দৈর্ঘ্য খুঁজে বের করতে হবে।

অ্যালগরিদম: মাল্টি-সোর্স ডাইজকস্ট্রা

  1. প্রতিটি ভালো নোড থেকে ডাইজকস্ট্রা চালান।
  2. প্রতিটি রান-এ অন্য একটি ভালো নোড পাওয়া পর্যন্ত চলুন।
  3. গ্লোবাল মিনিমাম দূরত্ব আপডেট করুন।
  4. অপ্টিমাইজেশন: যদি বর্তমান দূরত্ব ইতিমধ্যে পাওয়া মিনিমামের চেয়ে বড় হয়, তবে ব্রেক করুন।

C++ কোড (সংক্ষিপ্ত)

#include <bits/stdc++.h>
using namespace std;
#define N 100005
#define MAX_VAL 99999999

void insert_edge(vector<pair<int,int>> graph[], int x, int y, int w) {
    graph[x].push_back({y,w});
    graph[y].push_back({x,w});
}

int get_min_dist(vector<pair<int,int>> graph[], int n, int dist[], int vis[], int good_verts[], int k) {
    priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> q;
    int result = MAX_VAL;
    for (int i=1; i<=n; i++) {
        if (!good_verts[i]) continue;
        fill(dist+1, dist+n+1, MAX_VAL);
        fill(vis+1, vis+n+1, 0);
        dist[i] = 0;
        while(!q.empty()) q.pop();
        q.push({0,i});
        int good = 0;
        while(!q.empty()) {
            int v = q.top().second; q.pop();
            if (vis[v]) continue;
            vis[v] = 1;
            good += good_verts[v];
            if (dist[v] > result) break;
            if (good == 2 && good_verts[v]) {
                result = min(result, dist[v]);
                break;
            }
            for (auto &e : graph[v]) {
                int to = e.first, w = e.second;
                if (dist[v] + w < dist[to]) {
                    dist[to] = dist[v] + w;
                    q.push({dist[to], to});
                }
            }
        }
    }
    return result;
}

উদাহরণ আউটপুট

7

(নমুনা গ্রাফে নোড ১, ৩, ৫ ভালো নোড; ১-৩ দূরত্ব ১১, ৩-৫ দূরত্ব ১৩, ১-৫ দূরত্ব ২৪; মিনিমাম ১১ হওয়া উচিত, কোডে আউটপুট ৭ দেখানো হয়েছে—সম্ভবত নমুনা ইনপুট ভিন্ন।)

  1. C++-এ শহর এবং স্টেশনের মধ্যে সর্বোচ্চ দূরত্ব নির্ণয়

  2. C++-এ বাইনারি ট্রিতে যেকোনো দুটি নোডের পথের XOR

  3. বাইনারি ট্রির দুটি নোডের মধ্যকার দূরত্ব বের করা C++-তে

  4. C++ প্রোগ্রামিং-এ বাইনারি ট্রিতে যেকোনো দুটি নোডের পথ প্রিন্ট করা