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

C++ . में संभावित द्विभाजन

मान लीजिए कि हमारे पास N लोगों का एक समूह है (उनकी संख्या 1, 2, ..., N है), हम सभी को किसी भी आकार के दो उपसमूहों में विभाजित करना चाहेंगे। अब प्रत्येक व्यक्ति कुछ अन्य लोगों को नापसंद कर सकता है, और उन्हें एक ही समूह में नहीं जाना चाहिए। इसलिए, यदि नापसंद [i] =[a, b], तो यह इंगित करता है कि a और b नंबर वाले लोगों को एक ही समूह में रखने की अनुमति नहीं है। हमें यह पता लगाना होगा कि क्या इस तरह सभी को दो समूहों में विभाजित करना संभव है।

तो अगर इनपुट एन =4 और नापसंद =[[1,2], [1,3], [2,4]] जैसा है, तो आउटपुट सही होगा, समूह [1,4] और [2] होगा ,3].

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

  • समूह नामक सेट की एक सरणी बनाएं, दो समूह होंगे

  • dfs() नामक एक विधि बनाएं, यह नोड, एक सरणी ग्राफ और x को लेगा

  • औक्स :=1 - x

  • अगर समूह [ऑक्स] में नोड है, तो झूठी वापसी करें

  • समूहों में नोड डालें[x]

  • मैं के लिए 0 से ग्राफ़ के आकार में [नोड] - 1

    • यू:=ग्राफ [नोड, आई]

    • अगर group[aux] में कोई u नहीं है और dfs(u, graph, aux) गलत है, तो गलत रिटर्न करें

  • अन्यथा सही लौटें

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

  • आकार का ग्राफ़ नामक एक सरणी बनाएं [N + 1]

  • मेरे लिए 0 से लेकर नापसंद के आकार तक - 1

    • यू:=नापसंद [i, 0], वी:=नापसंद [i, 1]

    • ग्राफ़ में v डालें[u] और u को ग्राफ़ में डालें[v]

  • 1 से एन तक के लिए मैं

    • अगर समूह [0] में मैं नहीं है और समूह [1] में मैं नहीं है, तो

      • अगर dfs(i, graph, 0) गलत है, तो गलत रिटर्न करें

  • सच लौटें।

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   set <int> groups[2];
   bool dfs(int node, vector <int> graph[], int x){
      int aux = 1 - x;
      if(groups[aux].count(node)) return false;
      groups[x].insert(node);
      for(int i = 0; i < graph[node].size(); i++){
         int u = graph[node][i];
         if(!groups[aux].count(u) && !dfs(u, graph, aux)) return false;
      }
      return true;
   }
   bool possibleBipartition(int N, vector<vector<int<<& dislikes) {
      vector <int> graph[N + 1];
      for(int i = 0; i < dislikes.size(); i++){
         int u = dislikes[i][0];
         int v = dislikes[i][1];
         graph[u].push_back(v);
         graph[v].push_back(u);
      }
      for(int i = 1; i <= N;i++){
         if(!groups[0].count(i) && !groups[1].count(i)){
            if(!dfs(i, graph, 0)) return false;
         }
      }
      return true;
   }
};
main(){
   vector<vector<int>> v = {{1,2},{1,3},{2,4}};
   Solution ob;
   cout << (ob.possibleBipartition(4, v));
}

इनपुट

4
[[1,2],[1,3],[2,4]]

आउटपुट

true

  1. C++ . में रेखा परावर्तन

    मान लीजिए कि हमारे पास 2D तल पर n बिंदु हैं, हमें यह जांचना है कि क्या y-अक्ष के समानांतर कोई रेखा है जो दिए गए बिंदुओं को सममित रूप से दर्शाती है, दूसरे शब्दों में, जांचें कि क्या कोई ऐसी रेखा मौजूद है जो दी गई रेखा पर सभी बिंदुओं को प्रतिबिंबित करने के बाद मूल बिंदुओं का सेट वही होता है जो प्रतिबि

  1. C++ . में विकर्ण ट्रैवर्स II

    मान लीजिए कि हमारे पास nums नामक सूचियों की एक सूची है, हमें अंकों के सभी तत्वों को विकर्ण क्रम में दिखाना होगा। तो, अगर इनपुट पसंद है तो आउटपुट [1,6,2,8,7,3,9,4,12,10,5,13,11,14,15,16] होगा इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - एक सरणी रिट परिभाषित करें एक 2डी सरणी को परिभाषित

  1. सी ++ में प्रक्रिया को मारें

    मान लीजिए कि हमारे पास n प्रक्रियाएं हैं, यहां प्रत्येक प्रक्रिया की एक विशिष्ट आईडी होती है जिसे PID या प्रक्रिया आईडी कहा जाता है और उसका PPID (पैरेंट प्रोसेस आईडी) भी होता है। प्रत्येक प्रक्रिया में केवल एक पैरेंट प्रक्रिया होती है, लेकिन इसमें एक या अधिक चाइल्ड प्रक्रियाएं हो सकती हैं। यह एक प