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

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


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

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

आउटपुट 4 होगा।

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

  • मानचित्र को परिभाषित करें l
  • डीएफएस () नामक एक विधि को परिभाषित करें। यह वी ले जाएगा, एक सरणी जिसे विज़िट किया गया, ग्राफ़ और सी कहा जाता है। यह इस प्रकार काम करेगा -
  • विज़िट किया[v] :=true, set ans :=0
  • मैं के लिए 0 से ग्राफ़ के आकार की सीमा में[v]
    • अगर विज़िट किया गया[ग्राफ[v, i]] गलत है, तो
      • उत्तर :=अधिकतम उत्तर, dfs(ग्राफ[v, i], देखे गए, ग्राफ़, c + 1)
  • अगर c> सबसे अच्छा है, तो सबसे अच्छा:=c और नोड:=v
  • विजिट किया गया सेट[v] :=false
  • सी और उत्तर की अधिकतम वापसी
  • मुख्य विधि में, यह बढ़त सूची e
  • . ले जाएगा
  • n :=e का आकार, आकार n + 1 का ग्राफ़ नामक एक सरणी बनाएं
  • मैं के लिए 0 से n - 1 की सीमा में
    • ई[i, 1] को ग्राफ़ में डालें[e[i, 0]] और e[i, 0] को ग्राफ़ में डालें[e[i, 1]]
  • दो सरणियों का दौरा करें, और विज़िट की गई2 सरणी आकार n + 1, सर्वोत्तम सेट करें:=0 और नोड:=0
  • कॉल dfs(0, विज़िट किया गया, ग्राफ़)
  • वापसी dfs(नोड, विज़िट किया गया2, ग्राफ़)

उदाहरण(C++)

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

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
class Solution {
public:
   map <int ,int > l;
   int best;
   int node;
   int dfs(int v, bool* visited, vector <int> graph[], int c = 0){
      visited[v] = true;
      int ans = 0;
      for(int i = 0; i < graph[v].size(); i++){
         if(!visited[graph[v][i]])ans = max(ans,dfs(graph[v][i], visited, graph, c+1));
      }
      if(c > best){
         best = c;
         node = v ;
      }
      visited[v] = false;
      return max(c,ans);
   }
   int treeDiameter(vector<vector<int>>& e) {
      int n = e.size();
      vector <int> graph[n+1];
      for(int i = 0; i < n; i++){
         graph[e[i][0]].pb(e[i][1]);
         graph[e[i][1]].pb(e[i][0]);
      }
      bool* visited = new bool[n+1]();
      best = 0;
      node = 0;
      dfs(0, visited, graph);
      bool* visited2 = new bool[n+1]();
      return dfs(node, visited2, graph);
   }
};
main(){
   vector<vector<int>> v = {{0,1},{1,2},{2,3},{1,4},{4,5}};
   Solution ob;
   cout <<ob.treeDiameter(v);
}

इनपुट

[[0,1],[1,2],[2,3],[1,4],[4,5]]

आउटपुट

4

  1. C++ . में सममित वृक्ष

    मान लीजिए कि हमारे पास एक बाइनरी ट्री है और कार्य यह जांचना है कि यह स्वयं की समरूपता का निर्माण करता है या नहीं। एक सममित बाइनरी ट्री स्वयं की दर्पण छवि का निर्माण करता है। उदाहरण के लिए इनपुट-1: आउटपुट: True स्पष्टीकरण: चूंकि दिया गया बाइनरी ट्री स्वयं की मिरर इमेज बनाता है, आउटपुट ट

  1. सी++ में बीके ट्री परिचय

    बीके ट्री या बर्कहार्ड ट्री एक डेटा संरचना का एक रूप है जो आमतौर पर लेवेनशेटिन दूरी के आधार पर वर्तनी जांच करने के लिए उपयोग किया जाता है। इसका उपयोग स्ट्रिंग मिलान के लिए भी किया जाता है स्वत:सुधार सुविधा का उपयोग इस डेटा संरचना को बनाने के लिए किया जा सकता है। मान लीजिए कि हमारे पास एक शब्दकोश में

  1. C++ में ट्री नोड्स हटाएं

    मान लीजिए कि हमारे पास एक पेड़ है, इस पेड़ की जड़ें नोड 0 पर हैं, यह इस प्रकार दिया गया है - नोड्स की संख्या नोड्स है ith नोड का मान मान है[i] ith नोड का जनक माता-पिता है[i] हमें प्रत्येक सबट्री को हटाना होगा जिसका नोड्स के मानों का योग 0 है, ऐसा करने के बाद पेड़ में शेष नोड्स की संख्या वापस कर द