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

पायथन में सभी अक्षरों को वितरित करने के लिए न्यूनतम पथ खोजने का कार्यक्रम

मान लीजिए कि n शहर हैं और जो n -1 सड़कों से जुड़े हैं। किसी दूसरे शहर से किसी शहर का भ्रमण किया जा सकता है। अब शहरों की डाक व्यवस्था प्रतिदिन k पत्र वितरित करती है। पत्र का गंतव्य k विभिन्न शहरों में से कोई भी हो सकता है। एक डाक कर्मचारी को हर दिन सभी पत्रों को अपने पते पर पहुंचाना होता है। हमें यह पता लगाना होगा कि सभी पत्रों को वितरित करने के लिए कार्यकर्ता को न्यूनतम दूरी तय करनी होगी। कार्यकर्ता किसी भी शहर से शुरू कर सकता है।

तो, अगर इनपुट पसंद है

पायथन में सभी अक्षरों को वितरित करने के लिए न्यूनतम पथ खोजने का कार्यक्रम

और पत्रों को शहरों में पहुंचाना होगा (delv) 1, 2, और 4; तो आउटपुट 4 होगा।

कार्यकर्ता 1, 2, या 4 शहरों से डिलीवरी शुरू कर सकता है। यदि कार्यकर्ता शहर 1 से शुरू करता है, तो पथ 1->2->4 होगा, इसके विपरीत शहर 4 के मामले में; 4->2->1। कुल लागत 1 + 3 =4 होगी। यदि वह शहर 2 से शुरू करता है, तो लागत अन्य दो से अधिक होगी।

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

  • एक फ़ंक्शन को परिभाषित करें गहराई_खोज() । यह नोड लेगा, p
    • d1 :=-इन्फिनिटी
    • d2 :=-इन्फिनिटी
    • प्रत्येक जोड़ी के लिए x, y adj_list[node] में, करते हैं
      • यदि x, p के समान नहीं है, तो
        • d1 :=अधिकतम (d1, गहराई_खोज (x, नोड) + y)
        • यदि d1> d2, तो
          • d2 और d1 के मानों की अदला-बदली करें
        • ती[नोड] :=ती[नोड] + ती[x]
        • अगर 0 <ती[x]
        • योग :=योग + y
    • यदि d1> 0, तो
      • MAX :=अधिकतम (MAX, d1 + d2)
    • यदि d2> 0 और tj[नोड] शून्य नहीं है, तो
      • MAX :=अधिकतम (MAX, d2)
    • यदि tj[नोड] शून्य नहीं है, तो
      • d2 :=अधिकतम(0, d2)
    • d2 वापसी
  • k :=delv का आकार
  • adj_list :=एक नया नक्शा
  • ti :=आकार की एक नई सूची (नोड्स + 5) 0 से आरंभ की गई
  • tj :=आकार की एक नई सूची (नोड्स + 5) 0 से आरंभ की गई
  • डेल्व में प्रत्येक i के लिए, करते हैं
    • ती[i] :=1
    • tj[i] :=1
  • सड़कों में प्रत्येक आइटम के लिए, करें
    • x:=आइटम [0]
    • y:=आइटम[1]
    • c :=आइटम[2]
    • यदि x adj_list में मौजूद नहीं है, तो
      • adj_list[x] :=[]
    • यदि y adj_list में मौजूद नहीं है, तो
      • adj_list[y] :=[]
    • adj_list[x] के अंत में (y, c) जोड़ें
    • adj_list[y] के अंत में (x, c) जोड़ें
  • योग :=0
  • अधिकतम:=0
  • गहराई_खोज(1, 1)
  • रिटर्न SUM * 2 - MAX
  • उदाहरण

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

    import sys
    from math import inf as INF
    sys.setrecursionlimit(10**5 + 5)
    
    def depth_search(node, p):
        global SUM, MAX
        d1 = -INF
        d2 = -INF
    
        for x, y in adj_list[node]:
            if x != p:
                d1 = max(d1, depth_search(x, node) + y)
                if d1 > d2:
                    d1, d2 = d2, d1
    
                ti[node] += ti[x]
                if 0 < ti[x] < k:
                    SUM += y
    
        if d1 > 0: MAX = max(MAX, d1 + d2)
        if d2 > 0 and tj[node]: MAX = max(MAX, d2)
        if tj[node]: d2 = max(0, d2)
    
        return d2
    
    def solve(nodes, delv, roads):
        global k, ti, tj, adj_list, SUM, MAX
        k = len(delv)
        adj_list = {}
        ti = [0] * (nodes + 5)
        tj = [0] * (nodes + 5)
    
        for i in delv:
            ti[i] = tj[i] = 1
    
        for item in roads:
            x, y, c = map(int, item)
            if x not in adj_list: adj_list[x] = []
            if y not in adj_list: adj_list[y] = []
    
            adj_list[x].append([y, c])
            adj_list[y].append([x, c])
    
        SUM = 0
        MAX = 0
        depth_search(1,1)
        return SUM * 2 - MAX
    
    print(solve(5, [1, 2, 4], [(1,2,1),(2,3,2),(2,4,3),(1,5,1)]))
    

    इनपुट

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

    आउटपुट

    4

    1. ग्राफ़ में सबसे बड़े गुट के न्यूनतम आकार का पता लगाने का कार्यक्रम (पायथन)

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

    1. यह पता लगाने के लिए कार्यक्रम कि क्या पायथन में सभी के द्वारा ग्राफ़ को ट्रैवर्स किया जा सकता है

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

    1. पायथन में सभी बिंदुओं को जोड़ने के लिए न्यूनतम लागत खोजने का कार्यक्रम

      मान लीजिए कि हमारे पास बिंदु (x, y) के रूप में कुछ बिंदुओं के साथ बिंदु नामक एक सरणी है। अब दो बिंदुओं (xi, yi) और (xj, yj) को जोड़ने की लागत उनके बीच मैनहट्टन दूरी है, सूत्र है |xi - xj| + |yi - yj|। हमें सभी बिंदुओं को जोड़ने के लिए न्यूनतम लागत का पता लगाना होगा। इसलिए, यदि इनपुट पॉइंट्स की तरह