সমস্যা
একটি ওজনযুক্ত অ Diretto গ্রাফে কিছু নোড "ভালো নোড" (good nodes) চিহ্নিত। किन्हीं দুটি ভিন্ন ভালো নোডের মধ্যে সবচেয়ে ছোট পথের দৈর্ঘ্য খুঁজে বের করতে হবে।
অ্যালগরিদম: মাল্টি-সোর্স ডাইজকস্ট্রা
- প্রতিটি ভালো নোড থেকে ডাইজকস্ট্রা চালান।
- প্রতিটি রান-এ অন্য একটি ভালো নোড পাওয়া পর্যন্ত চলুন।
- গ্লোবাল মিনিমাম দূরত্ব আপডেট করুন।
- অপ্টিমাইজেশন: যদি বর্তমান দূরত্ব ইতিমধ্যে পাওয়া মিনিমামের চেয়ে বড় হয়, তবে ব্রেক করুন।
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
(নমুনা গ্রাফে নোড ১, ৩, ৫ ভালো নোড; ১-৩ দূরত্ব ১১, ৩-৫ দূরত্ব ১৩, ১-৫ দূরত্ব ২৪; মিনিমাম ১১ হওয়া উচিত, কোডে আউটপুট ৭ দেখানো হয়েছে—সম্ভবত নমুনা ইনপুট ভিন্ন।)