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

सी++ में एक पेड़ में सभी सेबों को इकट्ठा करने का न्यूनतम समय

मान लीजिए कि हमारे पास एक अप्रत्यक्ष पेड़ है जिसमें n शीर्ष हैं और इनकी संख्या 0 से n-1 तक है, जिसके शीर्षों में कुछ सेब हैं। हम पेड़ के एक किनारे पर चलने में 1 सेकंड खर्च करते हैं। पेड़ में सभी सेबों को शीर्ष 0 से शुरू करने और इस शीर्ष पर वापस आने के लिए हमें सेकंड में न्यूनतम समय निकालना होगा।

यहां अप्रत्यक्ष पेड़ के किनारों को सरणी किनारों में दिया गया है, जहां किनारों [i] =[from_i, to_i] इसका मतलब है कि किनारे से_i और to_i को जोड़ने वाला किनारा मौजूद है। इसके अतिरिक्त, एक अन्य सरणी में सेब है, जहां हैएप्पल [i] =सत्य का अर्थ है कि शीर्ष पर मेरे पास एक सेब है, अन्यथा, इसमें कोई सेब नहीं है।

इसलिए, यदि इनपुट n =7 और किनारों =[[0,1], [0,2], [1,4], [1,5], [2,3], [2,6]] की तरह है। , और सेब =[गलत, असत्य, सत्य, असत्य, सत्य, सत्य, असत्य] है, तो आउटपुट 8 होगा,

सी++ में एक पेड़ में सभी सेबों को इकट्ठा करने का न्यूनतम समय

जैसा कि ऊपर की छवि से हम उस पेड़ को देख सकते हैं जहाँ लाल कोने में एक सेब है। हरे तीरों द्वारा सभी सेबों को इकट्ठा करने का एक इष्टतम मार्ग दिखाया गया है।

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

  • देखे गए एक सेट को परिभाषित करें

  • एक फ़ंक्शन dfs() को परिभाषित करें, यह नोड, बराबर, एक सरणी a, एक सरणी ग्राफ़ [],

    लेगा
  • अस्थायी:=0

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

    • यदि x बराबर के समान है, तो -

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

    • अस्थायी:=अस्थायी + डीएफएस (एक्स, नोड, ए, ग्राफ)

  • रिट:=रिट + टेम्प * 2

  • सही लौटें जब एक [नोड] + अस्थायी> 0, अन्यथा 0

  • मुख्य विधि से निम्न कार्य करें -

  • रिट:=0

  • n सूचियों की एक सरणी परिभाषित करें जिसे ग्राफ़ कहा जाता है

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

    • ग्राफ़ के अंत में e[i, 1] डालें[e[i, 0]]

    • ग्राफ़ के अंत में e[i, 0] डालें[e[i, 1]]

  • dfs(0, -1, a, ग्राफ़)

  • वापसी रिट

उदाहरण

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

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6;
class Solution {
public:
   set<int> visited;
   int ret;
   int dfs(int node, int par, vector<bool>& a, vector<int> graph[]){
      int temp = 0;
      for (int x : graph[node]) {
         if (x == par)
            continue;
         temp += dfs(x, node, a, graph);
      }
      ret += temp * 2;
      return a[node] + temp > 0;
   }
   int minTime(int n, vector<vector<int> >& e, vector<bool>& a){
      ret = 0;
      vector<int> graph[n];
      for (int i = 0; i < e.size(); i++) {
         graph[e[i][0]].push_back(e[i][1]);
         graph[e[i][1]].push_back(e[i][0]);
      }
      dfs(0, -1, a, graph);
      return ret;
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{0,1},{0,2},{1,4},{1,5},{2,3},{2,6}};
   vector<bool> v1 = {false,false,true,false,true,true,false};
   cout << (ob.minTime(7,v, v1));
}

इनपुट

7, {{0,1},{0,2},{1,4},{1,5},{2,3},{2,6}},
{false,false,true,false,true,true,false}

आउटपुट

8

  1. C++ में सभी कर्मचारियों को सूचित करने के लिए आवश्यक समय

    मान लीजिए कि हमारे पास एक कंपनी है जिसमें प्रत्येक कर्मचारी के लिए एक विशिष्ट आईडी के साथ n कर्मचारी हैं। ये आईडी 0 से n - 1 तक होती हैं। कंपनी का मुखिया हेडआईडी वाला होता है। प्रत्येक कर्मचारी के पास प्रबंधक सरणी में दिया गया एक प्रत्यक्ष प्रबंधक होता है जहां प्रबंधक [i] i-वें कर्मचारी का प्रत्यक्ष

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

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

  1. C++ में पेड़ का व्यास

    मान लीजिए कि हमारे पास एक अप्रत्यक्ष पेड़ है; हमें इसका व्यास ज्ञात करना है - उस पेड़ के सबसे लंबे पथ में किनारों की संख्या उस पेड़ का व्यास है। यहां पेड़ को किनारे की सूची के रूप में दिया गया है जहां किनारों [i] =[यू, वी] नोड्स यू और वी के बीच एक द्विदिश किनारा है। प्रत्येक नोड में सेट {0, 1, ...,