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

सी ++ में दिए गए सेट में मौजूद प्रत्येक नोड से सभी पहुंच योग्य नोड्स खोजें

मान लीजिए कि हमारे पास एक अप्रत्यक्ष ग्राफ और शिखर का एक सेट है; हमें दिए गए सेट में मौजूद प्रत्येक शीर्ष से सभी पहुंच योग्य नोड्स को ढूंढना है।

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

सी ++ में दिए गए सेट में मौजूद प्रत्येक नोड से सभी पहुंच योग्य नोड्स खोजें

तब आउटपुट [1,2,3] और [4,5] होगा क्योंकि ये दो जुड़े हुए घटक हैं।

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

  • नोड्स :=ग्राफ़ में नोड्स की संख्या
  • विज़िट आकार की सरणी को परिभाषित करें:नोड्स+1। और 0 से भरें
  • एक मानचित्र को परिभाषित करें मी
  • comp_sum :=0
  • इनिशियलाइज़ i :=0 के लिए, जब i करें
  • u :=arr[i]
  • अगर विज़िट किया गया[u] गलत है, तो −
    • (comp_sum को 1 से बढ़ाएं)
    • m[visited[u]] :=नोड u से g का bfs ट्रैवर्सल, साथ ही comp_sum की गणना करें
  • m[visited[u]]
  • . का प्रिंट ट्रैवर्सल

उदाहरण

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

#include <bits/stdc++.h>
using namespace std;
class Graph{
   public:
      int nodes;
      list<int> *adj_list;
      Graph(int);
      void insert_edge(int, int);
      vector<int> BFS(int, int, int []);
};
Graph::Graph(int nodes) {
   this->nodes = nodes;
   adj_list = new list<int>[nodes+1];
}
void Graph::insert_edge(int u, int v) {
   adj_list[u].push_back(v);
   adj_list[v].push_back(u);
}
vector<int> Graph::BFS(int comp_sum, int src,int visited[]){
   queue<int> queue;
   queue.push(src);
   visited[src] = comp_sum;
   vector<int> reachableNodes;
   while(!queue.empty()) {
      int u = queue.front();
      queue.pop();
      reachableNodes.push_back(u);
      for (auto itr = adj_list[u].begin(); itr != adj_list[u].end(); itr++) {
         if (!visited[*itr]) {
            visited[*itr] = comp_sum;
            queue.push(*itr);
         }
      }
   }
   return reachableNodes;
}
void displayReachableNodes(int n, unordered_map <int, vector<int> > m) {
   vector<int> temp = m[n];
   for (int i=0; i<temp.size(); i++)
      cout << temp[i] << " ";
   cout << endl;
}
void get_all_reachable(Graph g, int arr[], int n) {
   int nodes = g.nodes;
   int visited[nodes+1];
   memset(visited, 0, sizeof(visited));
   unordered_map <int, vector<int> > m;
   int comp_sum = 0;
   for (int i = 0 ; i < n ; i++) {
      int u = arr[i];
      if (!visited[u]) {
         comp_sum++;
         m[visited[u]] = g.BFS(comp_sum, u, visited);
      }
      cout << "Reachable Nodes from " << u <<" are\n";
      displayReachableNodes(visited[u], m);
   }
}
int main() {
   int nodes = 5;
   Graph g(nodes);
   g.insert_edge(1, 2);
   g.insert_edge(2, 3);
   g.insert_edge(4, 5);
   int arr[] = {2, 4, 1};
   int n = sizeof(arr)/sizeof(int);
   get_all_reachable(g, arr, n);
}

इनपुट

g.insert_edge(1, 2);
g.insert_edge(2, 3);
g.insert_edge(4, 5);

आउटपुट

Reachable Nodes from 2 are
2 1 3
Reachable Nodes from 4 are
4 5
Reachable Nodes from 1 are
2 1 3

  1. C++ में एक बाइनरी ट्री में रूट से दिए गए नोड की दूरी ज्ञात करें

    मान लें कि हमारे पास कुछ नोड्स के साथ एक बाइनरी ट्री है। हमें रूट और दूसरे नोड u के बीच की दूरी का पता लगाना है। मान लीजिए पेड़ नीचे जैसा है: अब बीच की दूरी (रूट, 6) =2, पथ की लंबाई 2, के बीच की दूरी (रूट, 8) =3 आदि। इस समस्या को हल करने के लिए, हम बाएँ और दाएँ सबट्री में नोड को खोजने के लिए एक

  1. C++ में दिए गए परफेक्ट बाइनरी ट्री के सभी नोड्स का योग ज्ञात करें

    मान लीजिए कि हमारे पास एक सकारात्मक पूर्णांक L है, जो एक पूर्ण बाइनरी ट्री में स्तरों की संख्या का प्रतिनिधित्व करता है। इस परफेक्ट बाइनरी ट्री में लीफ नोड्स की संख्या 1 से n तक होती है। जहां n लीफ नोड्स की संख्या है। पैरेंट नोड बच्चों का योग है। हमारा काम इस परफेक्ट बाइनरी ट्री के सभी नोड्स के योग

  1. C++ में दिए गए BST में प्रत्येक नोड में सभी बड़े मान जोड़ें?

    एक BST या बाइनरी सर्च ट्री बाइनरी ट्री का एक रूप है जिसमें सभी बाएँ नोड छोटे होते हैं और सभी दाएँ नोड मूल मान से अधिक होते हैं। इस समस्या के लिए, हम एक बाइनरी ट्री लेंगे और उसमें वर्तमान नोड से बड़े सभी मान जोड़ेंगे। समस्या बीएसटी में प्रत्येक नोड में सभी बड़े मान जोड़ें को सरल बनाया गया है क्योंकि