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

सी ++ में प्रतिद्वंद्वी को पकड़ने के लिए आवश्यक न्यूनतम चरणों को खोजने का कार्यक्रम

मान लीजिए कि हमारे पास [u, v] के रूप में पेड़ के किनारों की एक सूची है, यह इंगित करता है कि u और v के बीच एक अप्रत्यक्ष किनारा है। और हमारे पास दो मान x और y भी हैं। यदि हम नोड x पर हैं, और हमारा प्रतिद्वंद्वी नोड y पर है। पहले दौर में, हम आगे बढ़ते हैं, फिर अगले दौर में प्रतिद्वंद्वी चलता है और इसी तरह। प्रतिद्वंद्वी एक राउंड में कोई चाल नहीं चलने का चयन कर सकता है। हमें प्रतिद्वंद्वी को पकड़ने के लिए आवश्यक न्यूनतम राउंड की संख्या ज्ञात करनी होगी।

इसलिए, यदि इनपुट किनारों की तरह है =[[0, 1], [0, 2], [1, 3], [1, 4]], x =0, y =3, तो आउटपुट 3 होगा, पहले की तरह, हम नोड 0 से 1 की ओर बढ़ते हैं। फिर प्रतिद्वंद्वी वर्तमान नोड 3 में रहता है। फिर हम नोड 3 पर जाते हैं।

सी ++ में प्रतिद्वंद्वी को पकड़ने के लिए आवश्यक न्यूनतम चरणों को खोजने का कार्यक्रम

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

  • एन:=1^5 + 5

  • विज़िट किए गए आकार की एक सरणी को परिभाषित करें:N और दूसरी विज़िट की गई 2 आकार की सरणी:N उन्हें −1

    . से भरें
  • एन नोड्स के लिए आसन्नता सूची ग्राफ बनाएं

  • किनारों की सूची में प्रत्येक किनारे के लिए, करें

    • इसे [v] ग्राफ़ के अंत में डालें[it[u]]

    • इसे [u] ग्राफ़ के अंत में डालें[it[v]]

  • एक कतार को परिभाषित करें w

  • आपको q में सम्मिलित करें

  • विज़िट किया गया[यू] :=0

  • जबकि q खाली नहीं है, करें -

    • नोड:=q का पहला तत्व

    • q से तत्व हटाएं

    • प्रत्येक नोड के लिए इसे ग्राफ़ में [नोड]

      • यदि विज़िट किया गया [यह] -1 के समान है, तो -

        • विज़िट किया गया [यह] :=विज़िट किया गया [नोड] + 1

        • इसे q में डालें

  • q में v डालें

  • रिट:=0

  • विज़िट किया गया2[v] :=0

  • जबकि q खाली नहीं है), करें −

    • नोड:=q का पहला तत्व

    • q से तत्व हटाएं

    • रिट :=अधिकतम रिट और 2 * (विज़िट [नोड])

    • प्रत्येक नोड के लिए इसे ग्राफ़ में [नोड]

      • यदि विज़िट किया गया2[यह] -1 के समान है और विज़िट किया गया2[नोड] + 2 <विज़िट किया गया है [यह], तो -

        • विज़िट किया गया2[यह] :=विज़िट किया गया2[नोड] + 1

        • इसे q में डालें

  • वापसी रिट

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int visited[N];
int visited2[N];
vector<int> graph[N];
class Solution {
   public:
   int solve(vector<vector<int>>& edges, int u, int v) {
      memset(visited, −1, sizeof visited);
      memset(visited2, −1, sizeof visited2);
      for (int i = 0; i < N; i++)
      graph[i].clear();
      for (auto& it : edges) {
         graph[it[0]].push_back(it[1]);
         graph[it[1]].push_back(it[0]);
      }
      queue<int> q;
      q.push(u);
      visited[u] = 0;
      while (!q.empty()) {
         int node = q.front();
         q.pop();
         for (auto& it : graph[node]) {
            if (visited[it] == −1) {
               visited[it] = visited[node] + 1;
               q.push(it);
            }
         }
      }
      q.push(v);
      int ret = 0;
      visited2[v] = 0;
      while (!q.empty()) {
         int node = q.front();
         q.pop();
         ret = max(ret, 2 * (visited[node]) − 1);
         for (auto& it : graph[node]) {
            if (visited2[it] == −1 && visited2[node] + 2 <
            visited[it]) {
               visited2[it] = visited2[node] + 1;
               q.push(it);
            }
         }
      }
      return ret;
   }
};
int solve(vector<vector<int>>& edges, int u, int v) {
   return (new Solution())−>solve(edges, u, v);
}
int main(){
   vector<vector<int>> edge = {{0, 1},{0, 2},{1, 3},{1, 4}};
   int x = 0, y = 3;
   cout << solve(edge, x, y);
}

इनपुट

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

आउटपुट

3

  1. सी ++ प्रोग्राम यह पता लगाने के लिए कि क्या कोई संख्या दो की शक्ति है?

    जांचें कि दी गई संख्या 2 की शक्ति है या नहीं। पहले नीचे जांचें कि कौन सी संख्याएं दो की शक्ति हैं या नहीं। यह कोड जांचता है कि संख्या विषम है या नहीं और फिर इसे समवर्ती रूप से विभाजित करें जब तक कि यह 0 या विषम न हो जाए। यदि यह 0 हो जाता है तो यह एक शक्ति 2 है अन्यथा यह नहीं है। एक बेहतर विकल्प संख

  1. सी ++ प्रोग्राम किसी दिए गए स्ट्रिंग के क्रमपरिवर्तन की संख्या का पता लगाने के लिए

    हम एक स्ट्रिंग के पात्रों को अलग-अलग क्रम में व्यवस्थित कर सकते हैं। यहां हम देखेंगे कि हम कैसे गिन सकते हैं कि किसी दिए गए स्ट्रिंग से कितने क्रमपरिवर्तन बन सकते हैं। हम जानते हैं कि यदि एक स्ट्रिंग abc है। इसमें तीन वर्ण हैं; हम उन्हें 3 में व्यवस्थित कर सकते हैं! =6 अलग-अलग तरीके। तो n वर्णों वा

  1. C++ प्रोग्राम ग्राफ़ को डिस्कनेक्ट करने के लिए काटने के लिए किनारों की न्यूनतम संख्या खोजने के लिए

    इस कार्यक्रम में हमें एक ग्राफ की एज कनेक्टिविटी को खोजने की जरूरत है। ग्राफ़ के ग्राफ़ की एक एज कनेक्टिविटी का अर्थ है कि यह एक पुल है, इसे हटाने से ग्राफ़ डिस्कनेक्ट हो जाएगा। डिस्कनेक्ट किए गए अप्रत्यक्ष ग्राफ़ में पुल को हटाने के साथ जुड़े घटकों की संख्या बढ़ जाती है। कार्य और छद्म कोड Begin &nb