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

पायथन में भारित ग्राफ से न्यूनतम संभव लागत ज्ञात करने का प्रोग्राम


मान लीजिए हमारे पास edges नामक पूर्णांकों की एक 2D सूची है जो एक अविभाजित ग्राफ का प्रतिनिधित्व करती है। इनपुट में हर पंक्ति एक एज [u, v, w] दर्शाती है जिसका अर्थ है नोड्स u और v जुड़े हुए हैं और एज का वजन w है। ग्राफ में 0 से n-1 तक n नोड्स होते हैं।

यहां एक पथ की लागत को पथ में किनारों की संख्या और पथ में किसी भी एज के अधिकतम वजन के गुणनफल के रूप में परिभाषित किया गया है। हमें नोड 0 से नोड n-1 तक न्यूनतम संभव लागत ज्ञात करनी है, या यदि ऐसा कोई पथ मौजूद नहीं है तो उत्तर -1 घोषित करें।

इसलिए, यदि इनपुट edges = [[0, 2, 100], [1, 2, 200], [1, 3, 100], [2, 3, 300]] जैसा है, तो आउटपुट 600 होगा।

हल करने के चरण

  • graph := एक नया मैप

  • weights := एक नया मैप

  • max_weight := 0

  • N := 0

  • edges में प्रत्येक u, v, w के लिए, करें

    • v को graph[u] के अंत में डालें

    • u को graph[v] के अंत में डालें

    • weights[u, v] := w

    • weights[v, u] := w

    • N := N, u + 1, v + 1 का अधिकतम

    • max_weight := max_weight, w का अधिकतम

  • result := infinity

  • जब तक max_weight >= 0, करें

    • d, weight := bfs(0, max_weight)

    • यदि d >= 0, तो

      • result := result और d * weight का न्यूनतम

      • max_weight := weight - 1

    • अन्यथा, लूप समाप्त करें

  • यदि result < infinity तो result लौटाएं अन्यथा -1

  • bfs() फ़ंक्शन परिभाषित करें। यह root, weight_cap लेगा

    • target := N - 1

    • Q := root, 0, 0 वाले एक डीक्यू

    • visited := [False] * N

    • visited[0] := True

    • जब तक Q खाली नहीं है, करें

      • v, d, current_weight := Q से अंतिम तत्व हटाएं

      • यदि v, N - 1 के समान है, तो d, current_weight लौटाएं

      • graph[v] में प्रत्येक w के लिए, करें

        • यदि visited[w] शून्येतर है, तो अगले इटरेशन पर जारी रखें

        • new_weight := weights[v, w]

        • यदि new_weight <= weight_cap, तो

          • visited[w] := True

          • (w, d + 1, current_weight और new_weight का अधिकतम) को Q के बाएं में डालें

    • -1, -1 लौटाएं

उदाहरण

from collections import defaultdict, deque

class Solution:
    def solve(self, edges):
        graph = defaultdict(list)
        weights = {}
        max_weight = 0
        N = 0
        for u, v, w in edges:
            graph[u].append(v)
            graph[v].append(u)
            weights[u, v] = w
            weights[v, u] = w
            N = max(N, u + 1, v + 1)
            max_weight = max(max_weight, w)
        def bfs(root, weight_cap):
            target = N - 1
            Q = deque([(root, 0, 0)])
            visited = [False] * N
            visited[0] = True
            while Q:
                v, d, current_weight = Q.pop()
                if v == N - 1:
                    return d, current_weight
                for w in graph[v]:
                    if visited[w]:
                        continue
                    new_weight = weights[v, w]
                    if new_weight <= weight_cap:
                        visited[w] = True
                        Q.appendleft((w, d + 1, max(current_weight, new_weight)))
            return -1, -1
        result = float("inf")
        while max_weight >= 0:
            d, weight = bfs(0, max_weight)
            if d >= 0:
                result = min(result, d * weight)
                max_weight = weight - 1
            else:
                break
        return result if result < float("inf") else -1

ob = Solution()
print(ob.solve([
    [0, 2, 100],
    [1, 2, 200],
    [1, 3, 100],
    [2, 3, 300]
]))

इनपुट

[[0, 2, 100], [1, 2, 200], [1, 3, 100], [2, 3, 300]]

आउटपुट

600
  1. पायथन में सभी संभावित वैध पथों से अधिकतम स्कोर ज्ञात करने का प्रोग्राम पायथन में सभी संभावित वैध पथों से अधिकतम स्कोर ज्ञात करने का प्रोग्राम

    मान लीजिए हमारे पास दो सरणियाँ nums1 और nums2 हैं। एक वैध पथ को इस प्रकार परिभाषित किया गया है: nums1 या nums2 को पार करने के लिए चुनें (सूचकांक-0 से)। सरणी को बाएं से दाएं पार करें। अब, यदि हम किसी ऐसे मान से गुजर रहे हैं जो nums1 और nums2 दोनों में मौजूद है, तो हम दूसरे सरणी पर पथ बदल सकते हैं।

  1. Python में ग्राफ में क्रिटिकल और स्यूडो-क्रिटिकल एज खोजने का प्रोग्राम Python में ग्राफ में क्रिटिकल और स्यूडो-क्रिटिकल एज खोजने का प्रोग्राम

    मान लीजिए, हमें एक ग्राफ दिया गया है जिसमें n वर्टेक्स हैं जो 0 से n-1 तक नंबर किए गए हैं। ग्राफ अनडायरेक्टेड है और प्रत्येक एज का एक वजन है। दिए गए ग्राफ से, हमें ग्राफ के MST में क्रिटिकल और स्यूडो-क्रिटिकल एज ढूंढने हैं। एक एज को क्रिटिकल एज कहा जाता है यदि उस एज को हटाने से MST का वजन बढ़ जाता

  1. Python में फेरिस व्हील से अधिकतम लाभ के लिए न्यूनतम रोटेशन खोजने का प्रोग्राम Python में फेरिस व्हील से अधिकतम लाभ के लिए न्यूनतम रोटेशन खोजने का प्रोग्राम

    मान लीजिए चार केबिन वाला एक फेरिस व्हील है और प्रत्येक केबिन में चार यात्री बैठ सकते हैं। पहिया वामावर्त घूमता है, और प्रत्येक रोटेशन के लिए, इसकी लागत run राशि होती है। अब हमारे पास एक ऐरे cust है जिसमें n आइटम हैं और प्रत्येक आइटम i iवीं रोटेशन से पहले फेरिस व्हील में बैठने की प्रतीक्षा कर रहे लो