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

पायथन में दो शीर्षों के बीच न्यूनतम पेनल्टी वाला पथ ज्ञात करने का प्रोग्राम


मान लीजिए हमें एक अनिर्देशित, भारित ग्राफ दिया गया है और हमें नोड a से नोड b तक न्यूनतम संभव पेनल्टी वाला पथ ढूंढना है। एक पथ की पेनल्टी उस पथ के सभी किनारों के भार का बिटवाइज OR है। इसलिए, हमें ऐसा 'न्यूनतम पेनल्टी' पथ ढूंढना है, और यदि दो नोड्स के बीच कोई पथ मौजूद नहीं है, तो हम -1 वापस करते हैं।

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

पायथन में दो शीर्षों के बीच न्यूनतम पेनल्टी वाला पथ ज्ञात करने का प्रोग्राम

प्रारंभ (s) = 1, अंत (e) = 3; तो आउटपुट 15 होगा।

शीर्ष 1 और 3 के बीच दो पथ मौजूद हैं। इष्टतम पथ 1→2→3 है, पथ की लागत (10 OR 5) = 15 है।

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

  • एक फ़ंक्शन helper() परिभाषित करें। यह G, s, e लेगा
    • v := एक नया सेट
    • c := n आकार की एक नई सूची जिसे अनंत मान से प्रारंभ किया गया हो
    • heap := जोड़ी (0, s) वाला एक नया हीप
    • जब तक heap का आकार > 0, करें
      • cst := heap से सबसे छोटा आइटम निकालें
      • cur := heap से सबसे छोटा आइटम निकालें
      • c[cur] := cst और c[cur] का न्यूनतम
      • यदि (cst, cur) v में मौजूद है, तो
        • अगली पुनरावृत्ति के लिए जाएं
      • यदि cur e के समान है, तो
        • c[cur] वापस करें
      • जोड़ी (cst, cur) को v में जोड़ें
      • G[cur] में प्रत्येक पड़ोसी, n_cost के लिए, करें
        • मान ((n_cost OR cst), पड़ोसी) को हीप में डालें
    • c[e] वापस करें
  • G := [n + 1 खाली सूचियों वाली एक नई सूची]
  • edges में प्रत्येक item के लिए, करें
    • u := item[0]
    • v := item[1]
    • w := item[2]
    • जोड़ी (v, w) को G[u] के अंत में डालें
    • जोड़ी (u, w) को G[v] के अंत में डालें
  • ans := helper(G, s, e)
  • यदि ans inf के समान है तो -1 वापस करें अन्यथा ans वापस करें

उदाहरण

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

import heapq
from math import inf

def helper(G, s, e):
    v = set()
    c = [inf] * len(G)
    heap = [(0, s)]
    while len(heap) > 0:
        cst, cur = heapq.heappop(heap)
        c[cur] = min(cst, c[cur])
        if (cst, cur) in v:
            continue
        if cur == e:
            return c[cur]
        v.add((cst, cur))
        for neighbor, n_cost in G[cur]:
            heapq.heappush(heap, (n_cost | cst, neighbor))
    return c[e]

def solve(n, edges, s, e):
    G = [[] for _ in range(n + 1)]
    for item in edges:
        u, v, w = map(int, item)
        G[u].append((v, w))
        G[v].append((u, w))
    ans = helper(G, s, e)
    return -1 if ans == inf else ans

print(solve(4, [(1, 2, 10), (2, 3, 5), (2, 4, 15), (1, 4, 20)], 1, 3))

इनपुट

4, [(1, 2, 10), (2, 3, 5), (2, 4, 15), (1, 4, 20)], 1, 3

आउटपुट

15
  1. पायथन में ग्राफ में सबसे बड़े क्लिक का न्यूनतम आकार ज्ञात करने का प्रोग्राम पायथन में ग्राफ में सबसे बड़े क्लिक का न्यूनतम आकार ज्ञात करने का प्रोग्राम

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

  1. पायथन में जांचें कि ग्राफ सभी द्वारा पारगम्य है या नहीं पायथन में जांचें कि ग्राफ सभी द्वारा पारगम्य है या नहीं

    मान लीजिए, हमें एक ग्राफ दिया गया है जिसमें n शीर्ष हैं जो 0 से n-1 तक क्रमांकित हैं। ग्राफ अनिर्देशित है और प्रत्येक किनारे का एक भार है। ग्राफ में तीन प्रकार के भार हो सकते हैं और प्रत्येक भार एक विशेष कार्य को दर्शाता है। दो लोग हैं जो ग्राफ को पार कर सकते हैं, अर्थात् जैक और केसी। जैक ग्राफ को

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

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