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

एक पेड़ में तोड़े जा सकने वाले किनारों की संख्या का पता लगाएं जैसे कि बिटवाइज़ या परिणामी दो पेड़ C++ में बराबर हों

अवधारणा

किसी दिए गए पेड़ के संबंध में एम नोड्स और प्रत्येक नोड से जुड़ी संख्या के संबंध में, हम किसी भी पेड़ के किनारे को तोड़ सकते हैं जिसके परिणामस्वरूप 2 नए पेड़ बनेंगे। यहां, हमें किनारों की संख्या को इस तरह से गिनना होगा ताकि उस किनारे को तोड़ने के बाद बनाए गए दो पेड़ों में मौजूद बिटवाइज या नोड्स बराबर हों। यह ध्यान दिया जाना चाहिए कि प्रत्येक नोड का मान ≤ 10^6 है।

इनपुट

values[]={1, 3, 1, 3}
     1
   / | \
  2 3 4

आउटपुट

2

यहां, 1 और 2 के बीच के किनारे को तोड़ा जा सकता है, परिणामी दो पेड़ों का बिटवाइज़ OR 3 होगा।

इसी तरह, 1 और 4 के बीच का किनारा भी तोड़ा जा सकता है।

विधि

यहां, उपर्युक्त समस्या को सरल डीएफएस (डेप्थ फर्स्ट सर्च) को लागू करने से हल किया जा सकता है। क्योंकि नोड्स का मान ≤ 10 ^ 6 है, इसे 22 बाइनरी बिट्स को लागू करने का प्रतिनिधित्व किया जा सकता है। इसके परिणामस्वरूप, बिटवाइज़ या नोड्स के मान का भी 22 बाइनरी बिट्स में प्रतिनिधित्व किया जा सकता है। यहां, विधि यह निर्धारित करने के लिए है कि प्रत्येक बिट को उप-पेड़ के सभी मानों में कितनी बार सेट किया जाता है। प्रत्येक किनारे के लिए हम सत्यापित करेंगे कि 0 से 21 तक प्रत्येक बिट के संबंध में सेट के रूप में उस विशेष बिट के साथ संख्याएं परिणामी पेड़ों में या तो शून्य हैं या दोनों परिणामी पेड़ों में शून्य से अधिक हैं और यदि यह देखा गया है कि स्थिति संतुष्ट है सभी बिट्स के लिए तो उस किनारे को परिणाम में गिना जाता है।

उदाहरण

// C++ implementation of the approach
#include<bits/stdc++.h>
using namespace std;
int m1[1000],x1[22];
// Uses array to store the number of times each bit
// is set in all the values of a subtree
int a1[1000][22];
vector<vector<int>> g;
int ans1 = 0;
// Shows function to perform simple DFS
void dfs(int u1, int p1){
   for (int i=0;i<g[u1].size();i++) {
      int v1 = g[u1][i];
      if (v1 != p1) {
         dfs(v1, u1);
         // Determining the number of times each bit is set
         // in all the values of a subtree rooted at v
         for (int i = 0; i < 22; i++)
            a1[u1][i] += a1[v1][i];
         }
      }
      // Verifying for each bit whether the numbers
      // with that particular bit as set are
      // either zero in both the resulting trees or
      // greater than zero in both the resulting trees
      int pp1 = 0;
      for (int i = 0; i < 22; i++) {
         if (!((a1[u1][i] > 0 && x1[i] - a1[u1][i] > 0)
            || (a1[u1][i] == 0 && x1[i] == 0))) {
         pp1 = 1;
         break;
      }
   }
   if (pp1 == 0)
   ans1++;
}
// Driver code
int main(){
   // Number of nodes
   int n1 = 4;
   // int n1 = 5;
   // Uses ArrayList to store the tree
   g.resize(n1+1);
   // Uses array to store the value of nodes
   m1[1] = 1;
   m1[2] = 3;
   m1[3] = 1;
   m1[4] = 3;
   /* m1[1] = 2;
   m1[2] = 3;
   m1[3] = 32;
   m1[4] = 43;
   m1[5] = 8;*/
   //Uses array to store the number of times each bit
   // is set in all the values in complete tree
   for (int i = 1; i <= n1; i++) {
      int y1 = m1[i];
      int k1 = 0;
      // Determining the set bits in the value of node i
      while (y1 != 0) {
         int p1 = y1 % 2;
         if (p1 == 1) {
            x1[k1]++;
            a1[i][k1]++;
         }
         y1 = y1 / 2;
         k1++;
      }
   }
   // push_back edges
   g[1].push_back(2);
   g[2].push_back(1);
   g[1].push_back(3);
   g[3].push_back(1);
   g[1].push_back(4);
   g[4].push_back(1);
   //g[1].push_back(5);
   //g[5].push_back(1);
   dfs(1, 0);
   cout<<(ans1);
}

आउटपुट

2

  1. अद्वितीय जोड़े खोजें जैसे कि प्रत्येक तत्व C++ में N से कम या उसके बराबर हो

    इस ट्यूटोरियल में, हम सीखेंगे कि दी गई संख्या n से कम अद्वितीय जोड़े कैसे खोजें। आइए समस्या को हल करने के लिए चरणों को देखें। नंबर को इनिशियलाइज़ करें। i =1 से i

  1. दो समुच्चयों का अधिकतम योग ज्ञात करने का कार्यक्रम जहाँ योग C++ में बराबर हों

    मान लीजिए कि हमारे पास संख्याओं की एक सूची है, जिसे अंक कहा जाता है, अब दो सेट खोजें क्योंकि उनके योग समान और अधिकतम हैं, तो योग मान ज्ञात करें। इसलिए, यदि इनपुट संख्या =[2, 5, 4, 6] की तरह है, तो आउटपुट 6 होगा, क्योंकि सेट [2, 4] और [6] हैं। इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - योग :

  1. बाइनरी ट्री में नोड्स का अधिकतम योग जैसे कि C++ प्रोग्राम में डायनामिक प्रोग्रामिंग का उपयोग करते हुए कोई भी दो आसन्न नहीं हैं

    इस समस्या में, हमें एक बाइनरी ट्री दिया जाता है जिसमें प्रत्येक नोड का एक मान होता है। हमारा काम बाइनरीट्री में नोड्स की अधिकतम राशि को खोजने के लिए एक प्रोग्राम बनाना है जैसे कि कोई भी दो आसन्न न हो। डायनामिक प्रोग्रामिंग का उपयोग करना। समस्या का विवरण - हम योग को अधिकतम करने के लिए बाइनरी ट्री के