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

पायथन में प्रिम के एल्गोरिथम का उपयोग करके MST ज्ञात करने का प्रोग्राम


मान लीजिए हमें एक ग्राफ दिया गया है और हमें उस ग्राफ से 'न्यूनतम स्पैनिंग ट्री' (MST) ढूंढना है। एक ग्राफ का MST एक भारित ग्राफ का उपसमुच्चय है जहां सभी शीर्ष मौजूद और जुड़े हुए हैं, और उपसमुच्चय में कोई चक्र मौजूद नहीं है। MST को न्यूनतम इसलिए कहा जाता है क्योंकि MST का कुल किनारा भार ग्राफ से न्यूनतम संभव होता है। तो, यहां हम प्रिम के MST एल्गोरिथम का उपयोग करते हैं और दिए गए ग्राफ से MST का कुल किनारा भार ढूंढते हैं।

इसलिए, यदि इनपुट इस तरह है

पायथन में प्रिम के एल्गोरिथम का उपयोग करके MST ज्ञात करने का प्रोग्राम

, शीर्षों की संख्या (n) 4 है, और प्रारंभिक शीर्ष (s) = 3, तो आउटपुट 14 होगा।

इस ग्राफ से MST यह होगा:

पायथन में प्रिम के एल्गोरिथम का उपयोग करके MST ज्ञात करने का प्रोग्राम

इस MST का कुल किनारा भार 14 है।

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

  • एक फ़ंक्शन mst_find() परिभाषित करें। यह G, s लेगा
    • distance := G के आकार की एक नई सूची जिसे ऋणात्मक अनंत मान से प्रारंभ किया गया हो
    • distance[s] := 0
    • itr := G के आकार की एक नई सूची जिसे False मान से प्रारंभ किया गया हो
    • c := 0
    • जब तक True, करें
      • min_weight := अनंत
      • m_idx := -1
      • i को 0 से G के आकार तक के लिए, करें
        • यदि itr[i] False के समान है, तो
          • यदि distance[i] < min_weight, तो
            • min_weight := distance[i]
            • m_idx := i
      • यदि m_idx -1 के समान है, तो
        • लूप से बाहर आएं
      • c := c + min_weight
      • itr[m_idx] := True
      • G[m_idx] के मानों में प्रत्येक जोड़ी i, j के लिए, करें
        • distance[i] := distance[i] और j का न्यूनतम
    • c वापस करें
  • G := n अन्य मैप वाला एक नया मैप
  • edges में प्रत्येक item के लिए, करें
    • u := item[0]
    • v := item[1]
    • w := item[2]
    • u := u - 1
    • v := v - 1
    • min_weight = min(G[u, v], w)
    • G[u, v] := min_weight
    • G[v, u] := min_weight
  • mst_find(G, s) वापस करें

उदाहरण

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

def mst_find(G, s):
    distance = [float("inf")] * len(G)
    distance[s] = 0
    itr = [False] * len(G)
    c = 0
    while True:
        min_weight = float("inf")
        m_idx = -1
        for i in range(len(G)):
            if itr[i] == False:
                if distance[i] < min_weight:
                    min_weight = distance[i]
                    m_idx = i
        if m_idx == -1:
            break
        c += min_weight
        itr[m_idx] = True
        for i, j in G[m_idx].items():
            distance[i] = min(distance[i], j)
    return c

def solve(n, edges, s):
    G = {i: {} for i in range(n)}
    for item in edges:
        u = item[0]
        v = item[1]
        w = item[2]
        u -= 1
        v -= 1
        try:
            min_weight = min(G[u][v], w)
            G[u][v] = min_weight
            G[v][u] = min_weight
        except KeyError:
            G[u][v] = w
            G[v][u] = w
    return mst_find(G, s)

print(solve(4, [(1, 2, 5), (1, 3, 5), (2, 3, 7), (1, 4, 4)], 3))

इनपुट

4, [(1, 2, 5), (1, 3, 5), (2, 3, 7), (1, 4, 4)], 3

आउटपुट

14
  1. Python से बाइनरी ट्री का लोएस्ट कॉमन एंसेस्टर (LCA) कैसे ढूंढें? Python से बाइनरी ट्री का लोएस्ट कॉमन एंसेस्टर (LCA) कैसे ढूंढें?

    बाइनरी ट्री में दो नोड्स का LCA ढूंढने के लिए रिकर्सिव DFS: अगर दोनों सबट्रीज़ में नोड्स मिलें तो वर्तमान नोड LCA है। एल्गोरिदम रिकर्सिव dfs(node) फंक्शन। अगर नोड x या y है: लेफ्ट/राइट चेक करें, कोई मिला तो वर्तमान नोड LCA। लेफ्ट और राइट दोनों से रिकर्सिव कॉल। अगर दोनों नॉन-None रिटर्न करें: वर्तमा

  1. Python से दो एक्सप्रेशन ट्रीज़ के इक्विवेलेंट होने की जांच कैसे करें? Python से दो एक्सप्रेशन ट्रीज़ के इक्विवेलेंट होने की जांच कैसे करें?

    दोनों ट्रीज़ के लीफ नोड्स (ऑपरेंड्स) की फ्रीक्वेंसी काउंट करके तुलना करें: अगर समान तो ट्रीज़ इक्विवेलेंट हैं। एल्गोरिदम DFS से प्रत्येक ट्री के लीफ नोड्स (ऑपरेंड्स) की फ्रीक्वेंसी Counter में गिनें। दोनों काउंटर्स तुलना करें: dic1 == dic2। ऑपरेटर्स को इग्नोर करें, केवल ऑपरेंड्स मैटर करते हैं (कम्य

  1. Python से बाइनरी ट्री में दिए गए नोड के दाएं वाले नोड को कैसे ढूंढें? Python से बाइनरी ट्री में दिए गए नोड के दाएं वाले नोड को कैसे ढूंढें?

    लेवल ऑर्डर ट्रैवर्सल (BFS) से दिए गए नोड के उसी लेवल पर दाएं पड़ोसी नोड को ढूंढें। एल्गोरिदम क्यू से BFS, लेवल दर लेवल प्रोसेस करें। प्रत्येक लेवल के नोड्स को temp लिस्ट में स्टोर करें। अगर टारगेट नोड u मिले तो उसका इंडेक्स नोट करें। अगर इंडेक्स अंतिम है तो None रिटर्न (दाएं कोई नहीं)। अन्यथा temp[