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

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

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

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

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

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • डेटा नामक एक डेटा संरचना बनाएं, इसमें नोड, जिला और वैल हो सकता है

  • एक 2डी सरणी लागत परिभाषित करें

  • लागत:=ऑर्डर की एक 2D सरणी (n + 1) x (K + 10) इसे अनंत से भरें

  • एक 3D सरणी ग्राफ़ परिभाषित करें

  • इनिशियलाइज़ i :=0 के लिए, जब i <फ्लाइट्स का आकार, अपडेट (i 1 से बढ़ाएँ), करें -

    • आप :=उड़ानें[i, 0]

    • v:=उड़ानें[i, 1]

    • ग्राफ़ के अंत में {v, उड़ानें[i, 2] } डालें[u]

  • एक प्राथमिकता कतार को परिभाषित करें q

  • डेटा (src, 0, 0) को q में डालें

  • लागत [src, 0] :=0

  • उत्तर :=-1

  • जबकि (नहीं q खाली है), करें -

    • अस्थायी:=q का शीर्ष तत्व

    • वक्र:=अस्थायी.नोड

    • q से तत्व हटाएं

    • जिला :=temp.dist

    • यदि curr dst के समान है, तो -

      • वापसी अस्थायी लागत

    • (दूरी में 1 से वृद्धि करें)

    • यदि जिला> K + 1, तो -

      • निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं

    • इनिशियलाइज़ करने के लिए मैं:=0, जब मैं <ग्राफ का आकार [कर्र], अपडेट (i 1 से बढ़ाएँ), करें -

      • पड़ोसी:=ग्राफ [कर्र, आई, 0]

      • अगर लागत [पड़ोसी, जिला]> लागत [कर, जिला - 1] + ग्राफ [कर, आई, 1], तो -

        • लागत [पड़ोसी, जिला]:=लागत [कर, जिला - 1] + ग्राफ [कर, आई, 1]

        • डेटा (पड़ोसी, जिला, लागत [पड़ोसी, जिला]) को क्यू में डालें

  • वापसी -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. सी ++ में प्रक्रिया को मारें

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

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

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

  1. C++ में आयत क्षेत्र II

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