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

C++ में दो अलग-अलग गुड नोड्स की किसी भी जोड़ी के बीच सबसे छोटी दूरी खोजें


मान लीजिए हमारे पास N अलग-अलग नोड्स और M एजेज के साथ एक दिया गया वेटेड अनडायरेक्टेड ग्राफ है, कुछ नोड्स गुड नोड्स हैं। हमें किन्हीं दो अलग-अलग गुड नोड्स की जोड़ी के बीच सबसे छोटी दूरी खोजनी है। दिए गए आरेख में पीले नोड्स को गुड नोड्स माना जाता है।

उदाहरण के लिए, यदि इनपुट इस तरह का है:

C++ में दो अलग-अलग गुड नोड्स की किसी भी जोड़ी के बीच सबसे छोटी दूरी खोजें

तो आउटपुट 11 होगा, क्योंकि गुड नोड्स के जोड़े और उनके बीच की दूरी हैं: (1 से 3) दूरी 11, (3 से 5) दूरी 13, (1 से 5) दूरी 24, जिनमें से 11 न्यूनतम है।

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

  • N := 100005
  • MAX_VAL := 99999999
  • एक प्रायोरिटी क्यू q बनाएं
  • रिजल्ट := MAX_VAL
  • i := 1 से n तक लूप करें:
    • यदि good_verts[i] false है, तो अगली इटरेशन पर जाएं
    • j := 1 से n तक लूप करें:
      • dist[j] := MAX_VAL
      • vis[j] := 0
    • dist[i] := 0
    • जब तक q खाली नहीं है, q से तत्व हटाएं
    • { 0, i } को q में डालें
    • good := 0
    • जब तक q खाली नहीं है:
      • v := q का शीर्ष तत्व
      • q से तत्व हटाएं
      • यदि vis[v] true है, तो अगली इटरेशन पर जाएं
      • vis[v] := 1
      • good := good + (1 यदि good_verts[v] true है, अन्यथा 0)
      • यदि dist[v] > रिजल्ट, तो लूप से बाहर निकलें
      • यदि good 2 के बराबर है और good_verts[v] true है, तो:
        • रिजल्ट := रिजल्ट और dist[v] का न्यूनतम
        • लूप से बाहर निकलें
      • j := 0 से graph[v] के आकार - 1 तक लूप करें:
        • to := graph[v][j].first
        • वेट := graph[v][j].second
        • यदि dist[v] + वेट < dist[to], तो:
          • dist[to] := dist[v] + वेट
          • { dist[to], to } को q में डालें
  • रिजल्ट लौटाएं

उदाहरण

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

#include <bits/stdc++.h> using namespace std; #define N 100005 #define MAX_VAL 99999999 void insert_edge(vector<pair<int, int> > graph[], int x, int y, int weight) { graph[x].push_back({ y, weight }); graph[y].push_back({ x, weight }); } int get_min_dist(vector<pair<int, int> > graph[], int n, int dist[], int vis[], int good_verts[], int k) { priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int>>> q; int result = MAX_VAL; for (int i = 1; i <= n; i++) { if (!good_verts[i]) continue; for (int j = 1; j <= n; j++) { dist[j] = MAX_VAL; vis[j] = 0; } dist[i] = 0; while (!q.empty()) q.pop(); q.push({ 0, i }); int good = 0; while (!q.empty()) { int v = q.top().second; q.pop(); if (vis[v]) continue; vis[v] = 1; good += good_verts[v]; if (dist[v] > result) break; if (good == 2 and good_verts[v]) { result = min(result, dist[v]); break; } for (int j = 0; j < graph[v].size(); j++) { int to = graph[v][j].first; int weight = graph[v][j].second; if (dist[v] + weight < dist[to]) { dist[to] = dist[v] + weight; q.push({ dist[to], to }); } } } } return result; } int main() { int n = 5, m = 5; vector<pair<int, int> > graph[N]; insert_edge(graph, 1, 2, 3); insert_edge(graph, 1, 2, 3); insert_edge(graph, 2, 3, 4); insert_edge(graph, 3, 4, 1); insert_edge(graph, 4, 5, 8); int k = 3; int good_verts[N], vis[N], dist[N]; good_verts[1] = good_verts[3] = good_verts[5] = 1; cout << get_min_dist(graph, n, dist, vis, good_verts, k); }

इनपुट

n = 5, m = 5 insert_edge(graph, 1, 2, 3); insert_edge(graph, 1, 2, 3); insert_edge(graph, 2, 3, 4); insert_edge(graph, 3, 4, 1); insert_edge(graph, 4, 5, 8); k = 3 good_verts[1] = good_verts[3] = good_verts[5] = 1;

आउटपुट

7

  1. C++ में बाइनरी ट्री में किन्हीं दो नोड्स के बीच पथ का XOR C++ में बाइनरी ट्री में किन्हीं दो नोड्स के बीच पथ का XOR

    इस समस्या में, हमें एक बाइनरी ट्री और बाइनरी ट्री के दो नोड्स दिए गए हैं। हमारा कार्य उन सभी नोड्स का XOR प्रिंट करना है जो दो नोड्स के बीच पथ में आते हैं। आइए एक उदाहरण से समस्या को समझते हैं, हमें 2 और 3 के बीच सभी नोड्स का XOR खोजने की आवश्यकता है। 2 से 3 तक का पथ, 2 → 6 → 1 → 3। हम 2^3^1^3 ख

  1. बाइनरी ट्री के दो नोड्स के बीच की दूरी खोजें C++ में बाइनरी ट्री के दो नोड्स के बीच की दूरी खोजें C++ में

    मान लीजिए हमारे पास कुछ नोड्स के साथ एक बाइनरी ट्री है। हमें दो नोड्स u और v के बीच की दूरी खोजनी है। मान लीजिए ट्री नीचे जैसा है - अब (4, 6) के बीच की दूरी = 4, पथ की लंबाई 4 है, (5, 8) के बीच की लंबाई = 5 आदि। इस समस्या को हल करने के लिए, हम LCA (निम्नतम सामान्य पूर्वज) खोजेंगे, फिर LCA से दो नोड

  1. C++ प्रोग्राम: बाइनरी ट्री में किन्हीं दो नोड्स के बीच पथ प्रिंट करना C++ प्रोग्राम: बाइनरी ट्री में किन्हीं दो नोड्स के बीच पथ प्रिंट करना

    हमें एक बाइनरी ट्री दिया गया है जिसके नोड्स विशिष्ट हैं और उस बाइनरी ट्री के दो नोड्स दिए गए हैं जिनके बीच का पथ हम प्रिंट करना चाहते हैं। उदाहरण के लिए - हम नोड 140 से 211 के बीच का पथ प्रिंट करना चाहते हैं तो इसका आउटपुट होना चाहिए - Output: 140->3->10->211 विचार यह है कि रूट नोड्स से दो