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

सी++ में सभी नोड्स का दौरा करने वाला सबसे छोटा पथ

मान लीजिए कि हमारे पास एन नोड्स के साथ एक अप्रत्यक्ष, जुड़ा हुआ ग्राफ है, इन नोड्स को 0, 1, 2, ..., एन -1 के रूप में लेबल किया गया है। ग्राफ़ की लंबाई N होगी, और j वैसा नहीं है जैसा मैं सूची में है ग्राफ़ [i] ठीक एक बार, यदि और केवल यदि नोड्स i और j जुड़े हुए हैं। हमें प्रत्येक नोड पर जाने वाले सबसे छोटे पथ की लंबाई ज्ञात करनी होगी। हम किसी भी नोड पर शुरू और बंद कर सकते हैं, हम कई बार नोड्स पर फिर से जा सकते हैं, और हम किनारों का पुन:उपयोग कर सकते हैं।

तो, अगर इनपुट [[1],[0,2,4], [1,3,4], [2], [1,2]] जैसा है, तो आउटपुट 4 होगा। अब यहां एक संभव है पथ [0,1,4,2,3] है।

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

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

  • n :=ग्राफ़ का आकार

  • अनुरोध :=2^(n - 1)

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

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

    • q में {0 OR (2^i), i} डालें

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

    • वापसी 0

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

    • sz :=q का आकार

    • जबकि sz गैर-शून्य है, प्रत्येक पुनरावृत्ति में sz को 1 से घटाएं, करें -

      • एक सरणी को परिभाषित करें curr =q का अगला तत्व

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

      • प्रारंभ करने के लिए मैं:=0, जब मैं <ग्राफ का आकार [कर्र [1]], अद्यतन (मैं 1 से बढ़ाएँ), करते हैं

        • यू:=ग्राफ [कर्र [1], आई]

        • न्यूमास्क:=(करंट[0] या 2^यू)

        • अगर न्यूमास्क रिक के समान है, तो -

          • वापसी एलवीएल

        • अगर विज़िट किए गए [यू] की कॉल काउंट (न्यूमास्क) है, तो −

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

        • विज़िट किए गए[u]

          . में newMask डालें
        • q में {newMask, u} डालें

  • वापसी -1

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   int shortestPathLength(vector<vector<int> >& graph){
      queue<vector<int> > q;
      int n = graph.size();
      int req = (1 << n) - 1;
      map<int, set<int> > visited;
      for (int i = 0; i < n; i++) {
         q.push({ 0 | (1 << i), i });
      }
      if (n == 1)
      return 0;
      for (int lvl = 1; !q.empty(); lvl++) {
         int sz = q.size();
         while (sz--) {
            vector<int> curr = q.front();
            q.pop();
            for (int i = 0; i < graph[curr[1]].size(); i++) {
               int u = graph[curr[1]][i];
               int newMask = (curr[0] | (1 << u));
               if (newMask == req)
                  return lvl;
               if (visited[u].count(newMask))
               continue;
               visited[u].insert(newMask);
               q.push({ newMask, u });
            }
         }
      }
      return -1;
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{1},{0,2,4},{1,3,4},{2},{1,2}};
   cout << (ob.shortestPathLength(v));
}

इनपुट

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

आउटपुट

4

  1. C++ में दिए गए नोड के उप-वृक्ष में सभी नोड्स का XOR

    इस समस्या में, हमें एक n ट्री दिया जाता है और कुछ प्रश्न हैं जो ट्री के नोड हैं। हमारा काम दिए गए नोड द्वारा बनाए गए सब-ट्री के सभी नोड्स के XOR को प्रिंट करना है। समस्या को समझने के लिए एक उदाहरण लेते हैं, प्रश्न - {1, 6, 5} आउटपुट - 0 0 5 स्पष्टीकरण - 1^6^3^2^4^7^5 6^2^4 5 इस समस्या को हल क

  1. C++ में ट्री नोड्स हटाएं

    मान लीजिए कि हमारे पास एक पेड़ है, इस पेड़ की जड़ें नोड 0 पर हैं, यह इस प्रकार दिया गया है - नोड्स की संख्या नोड्स है ith नोड का मान मान है[i] ith नोड का जनक माता-पिता है[i] हमें प्रत्येक सबट्री को हटाना होगा जिसका नोड्स के मानों का योग 0 है, ऐसा करने के बाद पेड़ में शेष नोड्स की संख्या वापस कर द

  1. C++ में मिन हीप में मान x से कम के सभी नोड्स प्रिंट करें

    इस समस्या में, हमें एक मिनी हीप दिया जाता है और एक मान x और हमें x से कम के सभी नोड्स को प्रिंट करना होगा। न्यूनतम ढेर एक विशेष प्रकार का बाइनरी ट्री है जिसमें प्रत्येक नोड का मान उसके चाइल्ड नोड के नोड मान से कम होता है। आइए समस्या को समझने के लिए एक उदाहरण लेते हैं - X =45 आउटपुट - 2 4 7 10