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

अधिकतम संभव विभाजन की गणना करने के लिए C++ प्रोग्राम दी गई शर्त के साथ ग्राफ में बनाया जा सकता है

मान लीजिए कि हमारे पास एक ग्राफ G का आसन्न मैट्रिक्स है। हमें यह जांचना है कि क्या हम शीर्षों को गैर-रिक्त सेट V1, ... Vk में विभाजित कर सकते हैं, जैसे कि:प्रत्येक किनारा दो आसन्न सेटों से संबंधित दो शीर्षों को जोड़ता है। यदि उत्तर हाँ है, तो हमें ऐसे भाग में समुच्चय k का अधिकतम संभव मान ज्ञात करना होगा।

तो, अगर इनपुट पसंद है

0 1 0 1 1 0
1 0 1 0 0 1
0 1 0 1 0 0
1 0 1 0 0 0
1 0 0 0 0 0
0 1 0 0 0 0

तो आउटपुट 4

. होगा

कदम

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

Define an array dp of size: 210.
n := size of matrix
fl := 1
ans := 0
for initialize i := 0, when i < n and fl is non-zero, update (increase i by 1), do:
   fill dp with -1
   dp[i] := 0
   Define one queue q
   insert i into q
   while (q is not empty), do:
      x := first element of q
      delete element from q
      for initialize j := 0, when j < n, update (increase j by 1), do:
         if matrix[x, j] is same as 1, then:
            if dp[j] is same as -1, then:
               dp[j] := dp[x] + 1
               insert j into q
            otherwise when |dp[j] - dp[x]| is not equal to 1, then:
               fl := 0
      for initialize j := 0, when j < n, update (increase j by 1), do:
         ans := maximum of ans and dp[j]
if fl is same as 0, then:
   return -1
Otherwise
   return ans + 1

उदाहरण

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

#include <bits/stdc++.h>
using namespace std;
int solve(vector<vector<int>> matrix){
   int dp[210];
   int n = matrix.size();
   int fl = 1;
   int ans = 0;
   for (int i = 0; i < n && fl; i++){
      memset(dp, -1, sizeof(dp));
      dp[i] = 0;
      queue<int> q;
      q.push(i);
      while (!q.empty()){
         int x = q.front();
         q.pop();
         for (int j = 0; j < n; j++){
            if (matrix[x][j] == 1){
               if (dp[j] == -1){
                  dp[j] = dp[x] + 1;
                  q.push(j);
               }
               else if (abs(dp[j] - dp[x]) != 1)
                  fl = 0;
            }
         }
      }
      for (int j = 0; j < n; j++)
         ans = max(ans, dp[j]);
   }
   if (fl == 0){
      return -1;
   }else{
      return ans + 1;
   }
}
int main(){
   vector<vector<int>> matrix = { { 0, 1, 0, 1, 1, 0 }, { 1, 0, 1, 0, 0, 1 }, { 0, 1, 0, 1, 0, 0 }, { 1, 0, 1, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 0 } };
   cout << solve(matrix) << endl;
}

इनपुट

{ { 0, 1, 0, 1, 1, 0 }, { 1, 0, 1, 0, 0, 1 }, { 0, 1, 0, 1, 0, 0 }, { 1, 0, 1, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 0 } }

आउटपुट

4

  1. सी ++ प्रोग्राम डोडेकैगन की संख्या गिनने के लिए जिसे हम आकार डी बना सकते हैं

    मान लीजिए कि हमारे पास एक संख्या d है। विचार करें कि अनंत संख्या में वर्गाकार टाइलें हैं और भुजाओं की लंबाई के साथ नियमित त्रिकोणीय टाइलें हैं। हमें यह पता लगाना है कि इन टाइलों का उपयोग करके हम कितने तरीकों से नियमित डोडेकागन (12-पक्षीय बहुभुज) बना सकते हैं। यदि उत्तर बहुत बड़ा है, तो परिणाम मोड 99

  1. C++ प्रोग्राम यह गिनने के लिए कि हम दो शर्तों के साथ कितने तरीकों से ब्लॉक पेंट कर सकते हैं

    मान लीजिए कि हमारे पास तीन नंबर एन, एम और के हैं। विचार करें कि एन ब्लॉक हैं जिन्हें वे एक पंक्ति में व्यवस्थित करते हैं। हम उन्हें पेंट करने के दो तरीकों पर विचार करते हैं। दो ब्लॉक के पेंट अलग-अलग होते हैं यदि और केवल अगर ब्लॉक को अलग-अलग रंगों में निम्नलिखित दो तरीकों से चित्रित किया जाता है -

  1. C++ प्रोग्राम कुछ शर्तों के साथ ग्राफ बनाने के लिए

    मान लीजिए कि हमारे पास दो नंबर एन और के हैं। विचार करें कि एन तत्वों के साथ एक अप्रत्यक्ष ग्राफ है। N शीर्ष निम्नलिखित शर्तों को पूरा करते हैं - ग्राफ़ सरल और जुड़ा हुआ है शीर्षों की संख्या 1 से N तक होती है मान लीजिए कि ग्राफ में किनारों की संख्या M है। किनारों को 1 से M तक क्रमांकित किया