Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में K स्टॉप के भीतर सबसे सस्ती उड़ानें


मान लीजिए हमारे पास n शहर हैं जो m उड़ानों से जुड़े हैं। प्रत्येक उड़ान u से शुरू होकर v पर पहुंचती है जिसकी कीमत w है। यदि हमारे पास सभी शहर और उड़ानें हैं, साथ में प्रारंभिक शहर src और गंतव्य dst, तो हमारा काम src से dst तक अधिकतम k स्टॉप के साथ सबसे सस्ती कीमत ढूंढना है। यदि ऐसा कोई मार्ग नहीं है, तो -1 लौटाएं।

उदाहरण के लिए, यदि इनपुट n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]], src = 0, dst = 2, k = 1 है, तो आउटपुट 200 होगा।

हल करने की विधि

हम डिज्क्स्ट्रा एल्गोरिदम का संशोधित संस्करण उपयोग करेंगे:

  • नोड, दूरी, और लागत रखने के लिए एक डेटा संरचना Data परिभाषित करें।
  • लागत मैट्रिक्स cost परिभाषित करें, आकार (n+1) x (K+10), अनंत से भरा।
  • ग्राफ को आसन्न सूची के रूप में बनाएं।
  • न्यूनतम-हीप प्राथमिकता कतार q का उपयोग करें।
  • Data(src, 0, 0) को q में डालें, cost[src][0] = 0 सेट करें।
  • जब तक q खाली न हो:
    • शीर्ष तत्व निकालें।
    • यदि वर्तमान नोड dst है, तो लागत लौटाएं।
    • दूरी बढ़ाएं, यदि दूरी > K+1 तो जारी रखें।
    • पड़ोसियों के लिए, यदि नई लागत कम है, तो अपडेट करें और q में डालें।
  • -1 लौटाएं।

उदाहरण

बेहतर समझ के लिए निम्न कार्यान्वयन देखें:

#include <bits/stdc++.h> using namespace std; struct Data{    int node, dist, cost;    Data(int a, int b, int c){       node = a;       dist = b;       cost = c;    } }; struct Comparator{    bool operator() (Data a, Data b) {       return !(a.cost < b.cost);    } }; class Solution { public:    vector<vector<int>> cost;    int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int K) {       cost = vector<vector<int> >(n + 1, vector<int>(K + 10, INT_MAX));       vector<vector<int> > graph[n];       for (int i = 0; i < flights.size(); i++) {          int u = flights[i][0];          int v = flights[i][1];          graph[u].push_back({ v, flights[i][2] });       }       priority_queue<Data, vector<Data>, Comparator> q;       q.push(Data(src, 0, 0));       cost[src][0] = 0;       int ans = -1;       while (!q.empty()) {          Data temp = q.top();          int curr = temp.node;          q.pop();          int dist = temp.dist;          if (curr == dst)             return temp.cost;          dist++;          if (dist > K + 1)             continue;          for (int i = 0; i < graph[curr].size(); i++) {             int neighbour = graph[curr][i][0];             if (cost[neighbour][dist] > cost[curr][dist - 1] + graph[curr][i][1]) {                cost[neighbour][dist] = cost[curr][dist - 1] + graph[curr][i][1];                q.push(Data(neighbour, dist, cost[neighbour][dist]));             }          }       }       return -1;    } }; main(){    Solution ob;    vector<vector<int>> v = {{0,1,100},{1,2,100},{0,2,500}};    cout << (ob.findCheapestPrice(3, v, 0, 2, 1)); }

इनपुट

3, {{0,1,100},{1,2,100},{0,2,500}}, 0, 2, 1

आउटपुट

200

  1. C++ में प्रोसेस मारें C++ में प्रोसेस मारें

    मान लीजिए हमारे पास n प्रोसेस हैं, यहां प्रत्येक प्रोसेस की एक अद्वितीय आईडी होती है जिसे PID या प्रोसेस आईडी कहा जाता है और इसका PPID (पैरेंट प्रोसेस आईडी) भी होता है। प्रत्येक प्रोसेस का केवल एक पैरेंट प्रोसेस होता है, लेकिन उसके एक या अधिक चाइल्ड प्रोसेस हो सकते हैं। यह एक ट्री संरचना की तरह है।

  1. C++ में गिलहरी सिमुलेशन C++ में गिलहरी सिमुलेशन

    एक पेड़, एक गिलहरी, और कई नट्स हैं। स्थितियों को 2D ग्रिड में सेल द्वारा दर्शाया जाता है। आपका लक्ष्य गिलहरी के लिए सभी नट्स को इकट्ठा करके उन्हें एक-एक करके पेड़ के नीचे रखने के लिए न्यूनतम दूरी ढूंढना है। गिलहरी एक समय में अधिकतम एक नट ले जा सकती है और चार दिशाओं में आगे बढ़ सकती है - ऊपर, नीचे,

  1. C++ में आयत क्षेत्रफल II (Rectangle Area II) - ओवरलैपिंग आयतों का कुल क्षेत्रफल C++ में आयत क्षेत्रफल II (Rectangle Area II) - ओवरलैपिंग आयतों का कुल क्षेत्रफल

    समस्या विवरण हमें अक्ष-संरेखित (axis-aligned) आयतों की एक सूची दी गई है। प्रत्येक आयत rectangle[i] = {x1, y1, x2, y2} द्वारा दर्शाया गया है, जहां (x1, y1) निचले-बाएं कोने का बिंदु है और (x2, y2) ऊपरी-दाएं कोने का बिंदु है। हमें तल (plane) में सभी आयतों द्वारा कवर किए गए कुल क्षेत्रफल को ज्ञात करना