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

C++ का उपयोग करके K-ary ट्री में वजन W वाले पथों की संख्या ज्ञात करें


इस लेख में, हम C++ का उपयोग करके K-ary ट्री में वजन W वाले पथों की संख्या की गणना करेंगे। हमें एक K-ary ट्री दिया गया है, जो एक ऐसा ट्री है जिसमें प्रत्येक नोड के K चाइल्ड होते हैं और प्रत्येक एज को एक वजन दिया गया है, जिसमें एक नोड से इसके सभी चाइल्ड तक वजन 1 से K तक अवरोही क्रम में होता है।

हमें रूट से शुरू होने वाले उन पथों की संचयी संख्या गिननी है जिनका वजन W है और कम से कम एक एज का वजन M है। तो, यहाँ उदाहरण है:

Input : W = 4, K = 3, M = 2 Output : 6

दी गई समस्या में, हम अपनी समय और स्थान जटिलता को कम करने के लिए DP का उपयोग करेंगे। मेमोइजेशन का उपयोग करके, हम अपने प्रोग्राम को बहुत तेज़ बना सकते हैं और इसे बड़े प्रतिबंधों के लिए उपयोग योग्य बना सकते हैं।

दृष्टिकोण

इस दृष्टिकोण में, हम ट्री को पार करेंगे और ट्रैक रखेंगे कि कम से कम M वजन वाली एज का उपयोग किया गया है या नहीं, और वजन W के बराबर है, तो हम उत्तर को बढ़ाते हैं।

इनपुट

#include <bits/stdc++.h> using namespace std; int solve(int DP[][2], int W, int K, int M, int used){     if (W < 0) // यदि W 0 से कम हो जाए तो 0 लौटाएं         return 0;     if (W == 0) {         if (used) // यदि used शून्य नहीं है तो 1 लौटाएं             return 1; // क्योंकि कम से कम M वजन की एक एज शामिल है         return 0;     }     if (DP[W][used] != -1) // यदि DP[W][used] -1 नहीं है तो इसका मतलब है इसे विज़िट किया गया है         return DP[W][used];     int answer = 0;     for (int i = 1; i <= K; i++) {         if (i >= M)             answer += solve(DP, W - i, K, M, used | 1); // यदि शर्त सत्य है                                                   // तो हम used को 1 में बदल देंगे         else             answer += solve(DP, W - i, K, M, used);     }     return answer; } int main(){     int W = 3; // वजन     int K = 3; // एक नोड के चाइल्ड की संख्या     int M = 2; // हमें कम से कम 2 वजन की एज शामिल करने की आवश्यकता है     int DP[W + 1][2]; // DP सरणी जो     memset(DP, -1, sizeof(DP)); // सरणी को -1 मान से आरंभ करना     cout << solve(DP, W, K, M, 0) << "\n";     return 0; }

आउटपुट

3

उपरोक्त कोड की व्याख्या

इस दृष्टिकोण में, किसी भी एज के वजन M को कम से कम एक बार शामिल किया गया है या नहीं, इसका ट्रैक रखा जाता है। दूसरे, हमने पथ के कुल वजन की गणना की यदि यह W के बराबर हो जाता है।

हम उत्तर को एक से बढ़ाते हैं, उस पथ को विज़िटेड के रूप में चिह्नित करते हैं, सभी संभावित पथों के माध्यम से जारी रखते हैं, और कम से कम M वजन वाली एक एज शामिल करते हैं।

निष्कर्ष

इस लेख में, हम डायनामिक प्रोग्रामिंग का उपयोग करके K-ary ट्री में वजन W वाले पथों की संख्या O(W*K) समय जटिलता में ज्ञात करने की समस्या को हल करते हैं।

हमने इस समस्या के लिए C++ प्रोग्राम और पूरा दृष्टिकोण (सामान्य और कुशल) भी सीखा जिससे हमने इस समस्या को हल किया।


  1. C++ में N-ary ट्री को पार करने के तरीकों की संख्या C++ में N-ary ट्री को पार करने के तरीकों की संख्या

    एक N-ary ट्री दिया गया है और हमें इस ट्री को पार करने के कुल तरीकों की संख्या निकालने का कार्य दिया गया है, उदाहरण के लिए -उपरोक्त ट्री के लिए, हमारा आउटपुट 192 होगा।इस समस्या के लिए, हमें कॉम्बिनेटोरिक्स के बारे में कुछ ज्ञान होना चाहिए। अब इस समस्या में, हमें बस हर पथ के लिए सभी संभावित संयोजनों क

  1. C++ का उपयोग करके स्टॉपिंग स्टेशनों की संख्या ज्ञात करें C++ का उपयोग करके स्टॉपिंग स्टेशनों की संख्या ज्ञात करें

    बिंदु X और Y के बीच n संख्या में इंटरमीडिएट ट्रेन स्टेशन हैं। उन विभिन्न तरीकों की गणना करें जिनसे ट्रेनों को s स्टेशनों पर रुकने के लिए व्यवस्थित किया जा सकता है जैसे कि कोई दो स्टेशन एक-दूसरे के बगल में न हों। तो इस लेख में, हम स्टॉपिंग स्टेशनों की संख्या ज्ञात करने के लिए हर संभव दृष्टिकोण की व्य

  1. C++ का उपयोग करके एक सेट पर रिफ्लेक्सिव रिलेशंस की संख्या ज्ञात करें C++ का उपयोग करके एक सेट पर रिफ्लेक्सिव रिलेशंस की संख्या ज्ञात करें

    इस लेख में, हम एक सेट पर रिफ्लेक्सिव रिलेशंस की संख्या ज्ञात करने के दृष्टिकोणों की व्याख्या करेंगे। इस समस्या में, हमें संख्या n दी गई है, और n प्राकृतिक संख्याओं के एक सेट पर, हमें रिफ्लेक्सिव रिलेशंस की संख्या निर्धारित करनी है।रिफ्लेक्सिव रिलेशन - एक सेट A में एक रिलेशन को रिफ्लेक्सिव कहा जाता ह