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

सी++ में पाठ्यक्रम अनुसूची IV

मान लीजिए कि कुल n पाठ्यक्रम हैं जिन्हें हम ले सकते हैं, पाठ्यक्रमों को 0 से n-1 तक लेबल किया गया है।

कुछ पाठ्यक्रमों में प्रत्यक्ष पूर्वापेक्षाएँ हो सकती हैं, उदाहरण के लिए, पाठ्यक्रम 0 लेने के लिए हमें पहले पाठ्यक्रम 1 लेना होगा, जिसे एक जोड़ी के रूप में व्यक्त किया जाता है:[1,0]।

इसलिए, यदि हमारे पास कई पाठ्यक्रम n हैं, तो प्रत्यक्ष पूर्वापेक्षित जोड़ियों की सूची और प्रश्नों के जोड़े की एक सूची है।

आपको प्रत्येक प्रश्न का उत्तर खोजना चाहिए [i] क्या पाठ्यक्रम प्रश्न [i] [0] पाठ्यक्रम प्रश्नों के लिए एक पूर्वापेक्षा है [i] [1] या नहीं। अंत में, हमें बूलियन की एक सूची लौटानी होगी, दिए गए प्रश्नों के उत्तर।

हमें यह ध्यान रखना होगा कि यदि पाठ्यक्रम a, पाठ्यक्रम b की पूर्वापेक्षा है और पाठ्यक्रम b, पाठ्यक्रम c की पूर्वापेक्षा है, तो पाठ्यक्रम a, पाठ्यक्रम c की एक पूर्वापेक्षा है।

इसलिए, यदि इनपुट n =3, पूर्वापेक्षाएँ =[[1,2], [1,0], [2,0]], क्वेरीज़ =[[1,0], [1,2]] की तरह है, तो आउटपुट [true,true]

. होगा

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

  • एन:=110

  • एक सरणी रिट परिभाषित करें

  • एक मानचित्र को इसमें परिभाषित करें

  • v में प्रत्येक तत्व के लिए, करें

    • इसे [1] ग्राफ़ के अंत में डालें[it[0]]

    • (इसमें [यह [1]] 1 से वृद्धि करें)

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

  • इनिशियलाइज़ i :=0 के लिए, जब i

    • अगर [i] 0 के समान है, तो -

      • q में i डालें

  • एक नक्शा idx परिभाषित करें

  • lvl को इनिशियलाइज़ करने के लिए:=1, जब q खाली न हो, तो अपडेट करें (lvl को 1 से बढ़ाएँ), करें -

    • sz :=q का आकार

    • जबकि sz 0 नहीं है, प्रत्येक पुनरावृत्ति में sz घटाएं, करें -

      • नोड:=q का पहला तत्व

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

      • प्रत्येक तत्व के लिए यह ग्राफ़ में [नोड]

        • (इसमें [इसे] 1 से घटाएं)

        • c[नोड] में प्रत्येक तत्व x के लिए, करें

          • c[it]

            . में x डालें
        • c[it]

          . में नोड डालें
        • अगर [यह] 0 के समान है, तो -

          • इसे q में डालें

  • प्रत्येक तत्व के लिए इसे x में करें

    • रिट के अंत में डालें (इसकी आवृत्ति [0] c[it[1]] में)

  • वापसी रिट

उदाहरण

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

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<bool> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
const int N = 110;
class Solution {
public:
   vector <int> graph[N];
   map <int, set <int>> c;
   vector<bool> checkIfPrerequisite(int n, vector<vector<int>>& v, vector<vector<int>>& x) {
      vector<bool> ret;
      map<int, int> in;
      for (auto& it : v) {
         graph[it[0]].push_back(it[1]);
         in[it[1]]++;
      }
      queue<int> q;
      for (int i = 0; i < n; i++) {
         if (in[i] == 0)
            q.push(i);
      }
      map<int, int> idx;
      for (int lvl = 1; !q.empty(); lvl++) {
         int sz = q.size();
         while (sz--) {
            int node = q.front();
            q.pop();
            for (auto& it : graph[node]) {
               in[it]--;
               for (auto& x : c[node])
                  c[it].insert(x);
               c[it].insert(node);
               if (in[it] == 0) {
                  q.push(it);
               }
            }
         }
      }
      for (auto& it : x) {
         ret.push_back(c[it[1]].count(it[0]));
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<vector<int>> prerequisites = {{1,2},{1,0},{2,0}}, queries = {{1,0},{1,2}};
   print_vector(ob.checkIfPrerequisite(3, prerequisites, queries));
}

इनपुट

3, {{1,2},{1,0},{2,0}}, {{1,0},{1,2}}

आउटपुट

[1, 1, ]

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

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

  1. C++ में जॉब शेड्यूल की न्यूनतम कठिनाई

    मान लीजिए कि हम d दिनों में कार्यों की एक सूची शेड्यूल करना चाहते हैं। कार्य निर्भर हैं इसलिए i-th कार्य पर काम करने के लिए, हमें सभी कार्यों को पूरा करना होगा जहां 0 <=j

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

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