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

सी ++ में वन बनाने के लिए पेड़ से अधिकतम किनारा हटाना

समस्या कथन

एक अप्रत्यक्ष पेड़ को देखते हुए, जिसमें सम संख्या में कोने होते हैं, हमें इस पेड़ से किनारों की अधिकतम संख्या को हटाने की आवश्यकता होती है, ताकि परिणामी जंगल के प्रत्येक जुड़े घटक में सम संख्या में कोने हों।

उदाहरण

सी ++ में वन बनाने के लिए पेड़ से अधिकतम किनारा हटाना

ऊपर दिखाए गए पेड़ में, हम लाल रंग में दिखाए गए अधिकतम 2 किनारों 0-2 और 0-4 को इस तरह हटा सकते हैं कि प्रत्येक जुड़े हुए घटक में सम संख्या में कोने होंगे।

एल्गोरिदम

  • पेड़ के कनेक्ट होने पर किसी भी प्रारंभिक नोड से DFS करें
  • उपट्री में नोड्स की संख्या को 0 के रूप में वर्तमान नोड के तहत रूट करें
  • वर्तमान नोड के प्रत्येक उपप्रकार के लिए पुनरावर्ती रूप से निम्नलिखित करें -
    • यदि वर्तमान सबट्री का आकार सम है, तो परिणाम 1 से बढ़ा दें क्योंकि हम सबट्री को डिस्कनेक्ट कर सकते हैं
    • अन्यथा मौजूदा सबट्री में नोड्स की संख्या को वर्तमान गणना में जोड़ें

उदाहरण

आइए अब एक उदाहरण देखें -

#include <bits/stdc++.h>
using namespace std;
int dfs(vector<int> g[], int u, bool visit[], int& res) {
   visit[u] = true;
   int currComponentNode = 0;
   for (int i = 0; i < g[u].size(); i++) {
      int v = g[u][i];
      if (!visit[v]) {
         int subtreeNodeCount = dfs(g, v, visit, res);
         if (subtreeNodeCount % 2 == 0)
            res++;
         else
            currComponentNode += subtreeNodeCount;
      }
   }
   return (currComponentNode + 1);
}
int maxEdgeRemovalToMakeForestEven(vector<int> g[], int N) {
   bool visit[N + 1];
   for (int i = 0; i <= N; i++)
   visit[i] = false;
   int res = 0;
   dfs(g, 0, visit, res);
   return res;
}
void addEdge(vector<int> g[], int u, int v) {
   g[u].push_back(v);
   g[v].push_back(u);
}
int main() {
   int edges[][2] = {{0, 2}, {0, 1}, {0, 4}, {2, 3}, {4, 5}, {5, 6}, {5, 7} };
   int N = sizeof(edges)/sizeof(edges[0]); vector<int> g[N + 1];
   for (int i = 0; i < N; i++)
   addEdge(g, edges[i][0], edges[i][1]);
   cout << "Answer = " << maxEdgeRemovalToMakeForestEven(g, N) << endl;
   return 0;
}

आउटपुट

Answer = 2

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

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

  1. C++ में बाइनरी ट्री में अधिकतम लम्बवत योग ज्ञात कीजिए

    मान लीजिए कि हमारे पास एक बाइनरी ट्री है। कार्य ऊर्ध्वाधर क्रम ट्रैवर्सल में सभी नोड्स के अधिकतम योग को प्रिंट करना है। तो अगर पेड़ नीचे जैसा है - लंबवत क्रम ट्रैवर्सल इस प्रकार है - 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 यहां अधिकतम 12 है। दृष्टिकोण सरल है। हम वर्टिकल ऑर्डर ट्रैवर्सल करेंगे, फिर योग

  1. C++ में एक पूर्ण ग्राफ़ से अधिकतम संभव एज डिसजॉइंट स्पैनिंग ट्री

    मान लीजिए हमारे पास एक पूरा ग्राफ है; हमें एज डिसजॉइंट स्पैनिंग ट्री की संख्या गिननी है। एज डिसजॉइंट स्पैनिंग पेड़ फैले हुए पेड़ हैं, जहां सेट में कोई भी दो पेड़ आम तौर पर किनारे नहीं होते हैं। मान लीजिए कि N (शीर्षों की संख्या) 4 है, तो आउटपुट 2 होगा। 4 शीर्षों का उपयोग करने वाला पूरा ग्राफ नीचे जै