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

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

समस्या कथन

एक पेड़ हमेशा एक द्विदलीय ग्राफ होता है क्योंकि हम हमेशा वैकल्पिक स्तरों के साथ दो अलग-अलग सेटों में टूट सकते हैं।

दूसरे शब्दों में, हम इसे हमेशा दो रंगों से रंगते हैं जैसे कि वैकल्पिक स्तरों का रंग समान हो। कार्य अधिकतम संख्या की गणना करना है। किनारों को पेड़ में जोड़ा जा सकता है ताकि यह द्विदलीय ग्राफ बना रहे।

उदाहरण

पेड़ के किनारों को शीर्ष जोड़े में निम्नानुसार दर्शाया गया है -

{1, 2}

{1, 3}

{2}, 4}

{3, 5} तो हमें इसे द्विदलीय ग्राफ रखने के लिए 2 और किनारों की आवश्यकता है

  • रंगीन ग्राफ में दो अलग-अलग सेटों से ग्राफ {1, 4, 5} और {2, 3}। चूंकि, 1 2 और 3 दोनों से जुड़ा है
  • हमारे पास 4 और 5 किनारे बचे हैं क्योंकि 4 पहले से ही 2 और 5 से 3 से जुड़ा है। केवल शेष विकल्प {4, 3} और {5, 2}
  • है।

एल्गोरिदम

  • ग्राफ का एक साधारण डीएफएस या बीएफएस ट्रैवर्सल करें और इसे दो रंगों से रंग दें
  • रंग लगाते समय दो रंगों से रंगे नोड्स की संख्या पर भी नज़र रखें। दो गणनाओं को count_color0 और count_color1 होने दें
  • अब हम जानते हैं कि एक द्विदलीय ग्राफ़ के अधिकतम किनारे हो सकते हैं count_color0 x count_color1
  • हम यह भी जानते हैं कि n नोड्स वाले पेड़ में n-1 किनारे होते हैं
  • तो हमारा उत्तर है count_color0 x count_color1 - (n-1)

उदाहरण

#include <bits/stdc++.h>
using namespace std;
long long count_color[2];
void dfs(vector<int> graph[], int node, int parent, int color) {
   ++count_color[color];
   for (int i = 0; i < graph[node].size(); ++i) {
      if (graph[node][i] != parent) {
         dfs(graph, graph[node][i], node, !color);
      }
   }
}
int getMaxEdges(vector<int> graph[], int n) {
   dfs(graph, 1, 0, 0);
   return count_color[0] * count_color[1] - (n - 1);
}
int main() {
   int n = 5;
   vector<int> graph[n + 1];
   graph[1].push_back(2);
   graph[1].push_back(3);
   graph[2].push_back(4);
   graph[3].push_back(5);
   cout << "Maximum edges = " << getMaxEdges(graph, n) << endl;
   return 0;
}

आउटपुट

जब आप उपरोक्त प्रोग्राम को संकलित और निष्पादित करते हैं। यह निम्नलिखित आउटपुट उत्पन्न करता है -

Maximum edges = 2

  1. C++ प्रोग्राम दिए गए ग्राफ़ में ब्रिज किनारों की संख्या का पता लगाने के लिए

    मान लीजिए, हमें एक अभारित, अप्रत्यक्ष ग्राफ दिया गया है जिसमें n कोने और m किनारे हैं। ग्राफ़ में ब्रिज का किनारा वह किनारा होता है जिसके हटाने से ग्राफ़ डिस्कनेक्ट हो जाता है। हमें दिए गए आलेख में ऐसे आलेखों की संख्या ज्ञात करनी है। ग्राफ़ में समानांतर किनारे या सेल्फ़-लूप नहीं होते हैं। इसलिए, यद

  1. सी ++ में एक पेड़ में दो गैर-अंतर्विभाजक पथों का अधिकतम उत्पाद

    इस समस्या में, हमें n नोड्स के साथ एक अप्रत्यक्ष कनेक्टेड ट्री T दिया जाता है। हमारा कार्य C++ में एक ट्री में दो गैर-अंतर्विभाजकपथों के अधिकतम उत्पाद को खोजने के लिए एक प्रोग्राम बनाना है। समस्या का विवरण - एक पेड़ में दो अप्रतिच्छेदी पथों का अधिकतम गुणनफल ज्ञात करना। हम सभी गैर-दिलचस्प पथ खोजेंगे

  1. सी ++ में एक अप्रत्यक्ष ग्राफ में किनारों की संख्या की गणना करें

    यह देखते हुए कि कार्य एक अप्रत्यक्ष ग्राफ में किनारों की संख्या की गणना करना है। एक अप्रत्यक्ष ग्राफ एक ग्राफ बनाने के लिए एक साथ जुड़े हुए शिखरों का एक समूह है, जिसके सभी किनारे द्विदिश हैं। अप्रत्यक्ष ग्राफ़ किसी भी दिशा में एक नोड से दूसरे कनेक्टेड नोड तक जा सकते हैं। नीचे अप्रत्यक्ष ग्राफ का एक