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

सभी दिए गए ट्रिपल के लिए कम से कम लागत पथों का योग जानने के लिए सी ++ प्रोग्राम

मान लीजिए, शहरों के बीच n शहर और m सड़कें हैं। एम सड़कें हमें सड़कों की एक श्रृंखला में दी गई हैं जहां सड़कें प्रारूप {ऑर्स, डेस्टिनेशन, वेट} में हैं। अब, हम एक त्रिक (s, t, k) को परिभाषित करते हैं जहाँ s, t, और k शहर हैं। अब हमें शहर s से शहर t तक जाने के लिए आवश्यक न्यूनतम समय की गणना करनी होगी। s से t तक जाने के लिए, केवल 1 से k के भीतर के शहरों का दौरा किया जा सकता है। यदि शहर t, s से अगम्य है, तो हम 0 लौटाते हैं। हमें सभी त्रिक (s, t, k) के लिए न्यूनतम समय की गणना करनी होगी और उनका योग प्रिंट करना होगा।

इसलिए, यदि इनपुट n =4, m =2, किनारों ={{1, 2, 5}, {2, 3, 4}, {3, 4, 3}} जैसा है, तो आउटपुट 63 होगा।

कदम

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

Define one 2D array dvec initialized with value infinity
for initialize i := 0, when i < n, update (increase i by 1), do:
   dvec[i, i] := 0
for initialize i := 0, when i < m, update (increase i by 1), do:
   a := first value of (edges[i])
   b := second value of (edges[i])
   c := third value of (edges[i])
   decrease a and b by 1
   dvec[a, b] := c
res := 0
for initialize k := 0, when k < n, update (increase k by 1), do:
   for initialize i := 0, when i < n, update (increase i by 1), do:
       for initialize j := 0, when j < n, update (increase j by 1), do:
       dvec[i, j] := minimum of (dvec[i, j] and dvec[i, k] + dvec[k, j])
       if dvec[i, j] is not equal to infinity, then:
          res := res + dvec[i, j]
print(res)

उदाहरण

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

#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;

void solve(int n, int m, vector<tuple<int, int, int>> edges){
   vector<vector<int>> dvec(n, vector<int>(n, INF));
   for(int i = 0; i < n; i++)
      dvec[i][i] = 0;
   for(int i = 0; i < m; i++) {
      int a = get<0> (edges[i]);
      int b = get<1> (edges[i]);
      int c = get<2> (edges[i]);
      a--; b--;
      dvec[a][b] = c;
   }
   int res = 0;
   for(int k = 0; k < n; k++) {
      for(int i = 0; i < n; i++) {
         for(int j = 0; j < n; j++) {
            dvec[i][j] = min(dvec[i][j], dvec[i][k]+dvec[k][j]);
            if(dvec[i][j] != INF)
               res += dvec[i][j];
         }
      }
   }
   cout << res << endl;
}
int main() {
   int n = 4, m = 2;
   vector<tuple<int, int, int>> edges = {{1, 2, 5}, {2, 3, 4}, {3, 4, 3}};
   solve(n, m, edges);
   return 0;
}

इनपुट

4, 2, {{1, 2, 5}, {2, 3, 4}, {3, 4, 3}}

आउटपुट

63

  1. C++ प्रोग्राम ग्राफ में सुपर वर्टिस का पता लगाने के लिए

    मान लीजिए, हमें एक ग्राफ दिया गया है जिसमें n शीर्ष हैं। कोने 1 से n तक गिने जाते हैं, और वे सरणी किनारों में दिए गए किनारों से जुड़े होते हैं। प्रत्येक शीर्ष का 1 से n तक की संख्या के भीतर x मान होता है जो कि सरणी मान में दिया जाता है। अब, हमें ग्राफ से अति शीर्षों का पता लगाना है। एक शीर्ष i को सु

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

    मान लीजिए, हमें एक अभारित, अप्रत्यक्ष ग्राफ दिया गया है जिसमें n कोने और m किनारे हैं। ग्राफ़ में ब्रिज का किनारा वह किनारा होता है जिसके हटाने से ग्राफ़ डिस्कनेक्ट हो जाता है। हमें दिए गए आलेख में ऐसे आलेखों की संख्या ज्ञात करनी है। ग्राफ़ में समानांतर किनारे या सेल्फ़-लूप नहीं होते हैं। इसलिए, यद

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

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