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

C++ প্রোগ্রাম: ট্রেন দিয়ে উৎস থেকে গন্তব্য স্টেশন পৌঁছাতে ন্যূনতম সময় গণনা


মান লিজিয়ে, n টি স্টেশন m টি ট্র্যাক দ্বারা সংযুক্ত। স্টেশনগুলো ১ থেকে n পর্যন্ত নামকরণ করা আছে। ট্র্যাকগুলো দ্বিমুখী। আমাদের src স্টেশন থেকে dst স্টেশনে পৌঁছাতে হবে। i-তম রেলপথের উৎস ও গন্তব্য স্টেশন 'roads' অ্যারেতে দেওয়া আছে যেখানে roads[i] = {station1, station2}। j-তম স্টেশন থেকে সমস্ত সংযুক্ত স্টেশনের দিকে kj-র গুণক সময়ে ট্রেন ছাড়ে এবং প্রতিটি ট্রেন tj সময় নেয় পৌঁছাতে। মানগুলো 'departure' অ্যারেতে দেওয়া আছে যেখানে প্রতিটি উপাদান হলো {tj, kj}। এখন আমাদের লক্ষ্য হলো src থেকে dst পৌঁছাতে ন্যূনতম সম্ভাব্য সময় বের করা। আমরা একাধিক ট্রেন বদলি দিতে পারি এবং ট্রেন বদলি দিতে সময় নগণ্য।

যেমন, ইনপুট হলে n = 4, m = 3, src = 1, dst = 4, roads = {{1, 2}, {2, 4}, {3, 4}}, departure = {{2, 1}, {3, 5}, {7, 6}}, তবে আউটপুট হবে 8।

স্টেশন ১ থেকে সময় ০-তে ট্রেন নিয়ে স্টেশন ২-এ যাওয়া হয়। স্টেশন ২ পৌঁছাতে ২ একক সময় লাগে। স্টেশন ২ থেকে সময় ৫-তে ট্রেন নিয়ে স্টেশন ৪-এ যাওয়া হয়। স্টেশন ৪ পৌঁছাতে ৩ একক সময় লাগে। মোট সময় = (৫ + ৩) = ৮।

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

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

src := src - 1 dst := dst - 1 graph[n] অ্যারে সংজ্ঞায়িত করুন যা টাপল ধারণ করবে i := 0 থেকে m-1 পর্যন্ত: a := roads[i]-র ১ম মান - 1 b := roads[i]-র ২য় মান - 1 t := departure[i]-র ১ম মান k := departure[i]-র ২য় মান graph[a]-র শেষে (b, t, k) যোগ করুন graph[b]-র শেষে (a, t, k) যোগ করুন dp অ্যারে সংজ্ঞায়িত করুন আকার n, মান -9999 priq প্রায়োরিটি কিউ সংজ্ঞায়িত করুন যা পেয়ার ধারণ করবে dp[src] := 0 priq-তে pair(-dp[src], src) যোগ করুন while priq খালি নয়: (w, a) := priq-র সর্বোচ্চ মান priq-র থেকে মুছুন if a == dst, তবে: return -w if w < dp[a], তবে: continue graph[a]-র প্রতিটি v জন্য: (b, t, k) := v weight := (w - k + 1) / k * k - t if weight > dp[b], তবে: dp[b] := weight priq-তে pair(weight, b) যোগ করুন return -1

উদাহরণ

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

#include <bits/stdc++.h> using namespace std; int solve(int n, int m, int src, int dst, vector<pair<int, int>> roads, vector<pair<int, int>> departure){    src -= 1;    dst -= 1;    vector<tuple<int, int, int>> graph[n];    int a, b;    int t, k;    for(int i = 0; i < m; i++){       a = roads[i].first - 1;       b = roads[i].second - 1;       t = departure[i].first;       k = departure[i].second;       graph[a].emplace_back(b, t, k);       graph[b].emplace_back(a, t, k);    }    vector<int> dp(n, -9999);    priority_queue<pair<int, int>> priq;    dp[src] = 0;    priq.push(make_pair(-dp[src], src));    int w;    while(not priq.empty()){       tie(w, a) = priq.top();       priq.pop(); if(a == dst){          return -w;       }       if(w < dp[a])          continue;       for(auto &v: graph[a]){          tie(b, t, k) = v;          int weight = (w - k + 1) / k * k - t; if(weight > dp[b]){ dp[b] = weight; priq.push(make_pair(weight, b)); } } } return -1; } int main() { int n = 4, m = 3, src = 1, dst = 4; vector<pair<int, int>> roads = {{1, 2}, {2, 4}, {3, 4}}, departure = {{2, 1}, {3, 5}, {7, 6}}; cout<< solve(n, m, src, dst, roads, departure); return 0; }

ইনপুট

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

আউটপুট

8

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

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

  3. C++ প্রোগ্রাম: গাড়ি বিক্রি করে সর্বোচ্চ লাভ অর্জন

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